簡體   English   中英

“PSQLException:致命:抱歉,已經有太多客戶端”在使用jOOQ和Spring Boot進行集成測試時出錯

[英]“PSQLException: FATAL: sorry, too many clients already” error in integration tests with jOOQ & Spring Boot

關於此錯誤和建議的解決方案已經有類似的問題; 例如,增加postgresql.conf max_connections和/或調整應用請求的最大連接數。 但是,我的問題更具體地說是在Spring Boot應用程序中使用jOOQ。

我將jOOQ集成到我的應用程序中,就像在GitHub上的示例一樣。 也就是說,我使用DataSourceConnectionProviderTransactionAwareDataSourceProxy來處理數據庫連接,我將DSLContext注入需要它的類中。

我的應用程序為前端提供了各種Web服務,到目前為止我從未在開發或測試環境中遇到過PSQLException。 我在本地運行所有集成測試(大約1000)時才開始出錯。 我不希望在處理連接時出現一些泄漏,因為Spring和jOOQ管理資源; 然而,如果在生產中也會發生這種錯誤讓我擔心。

簡而言之,使用DataSourceConnectionProvider管理連接有更好的選擇嗎? 請注意,我已經嘗試過使用DefaultConnectionProvider ,並嘗試使spring.datasource.max-active低於Postgres允許的max_connections 到目前為止還沒有解決我的問題。

由於你的問題似乎不是關於使用PostgreSQL連接/數據源的最佳方式,我將回答有關jOOQ的部分並使用其DataSourceConnectionProvider

使用DataSourceConnectionProvider

一般來說沒有更好的選擇 為了理解DataSourceConnectionProvider (實現),您必須了解ConnectionProvider (其規范)。 它是jOOQ用於兩件事的SPI:

  • 在運行語句或事務之前acquire()連接
  • 在運行語句(可能是獲取結果)或事務之后release()連接

DataSourceConnectionProvider是通過DataSource通過DataSource.getConnection()獲取連接並通過Connection.close()釋放它來實現的。 這是與數據源交互的最常用方式,以便讓DataSource實現處理事務和/或池語義。

在您的情況下,這是否是一個好主意可能取決於您所做的個別配置。 它通常是個好主意,因為您通常不希望手動管理連接生命周期。

使用DefaultConnectionProvider

這肯定可以代替,如果jOOQ不close()你的連接,你自己會這樣做。 我希望這對你的特定情況沒有影響,因為你將使用例如手動實現DataSourceConnectionProvider語義

try (Connection c = ds.getConnection()) {

    // Implicitly using a DefaultConnectionProvider
    DSL.using(c).select(...).fetch();

// Implicit call to c.close()
}

換句話說:這可能不是與jOOQ相關的問題,而是與您的數據源相關的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM