![](/img/trans.png)
[英]Spring Boot “PSQLException: FATAL: sorry, too many clients already” when running tests
[英]“PSQLException: FATAL: sorry, too many clients already” error in integration tests with jOOQ & Spring Boot
關於此錯誤和建議的解決方案已經有類似的問題; 例如,增加postgresql.conf
max_connections
和/或調整應用請求的最大連接數。 但是,我的問題更具體地說是在Spring Boot應用程序中使用jOOQ。
我將jOOQ集成到我的應用程序中,就像在GitHub上的示例一樣。 也就是說,我使用DataSourceConnectionProvider
和TransactionAwareDataSourceProxy
來處理數據庫連接,我將DSLContext
注入需要它的類中。
我的應用程序為前端提供了各種Web服務,到目前為止我從未在開發或測試環境中遇到過PSQLException。 我在本地運行所有集成測試(大約1000)時才開始出錯。 我不希望在處理連接時出現一些泄漏,因為Spring和jOOQ管理資源; 然而,如果在生產中也會發生這種錯誤讓我擔心。
簡而言之,使用DataSourceConnectionProvider
管理連接有更好的選擇嗎? 請注意,我已經嘗試過使用DefaultConnectionProvider
,並嘗試使spring.datasource.max-active
低於Postgres允許的max_connections
。 到目前為止還沒有解決我的問題。
由於你的問題似乎不是關於使用PostgreSQL連接/數據源的最佳方式,我將回答有關jOOQ的部分並使用其DataSourceConnectionProvider
:
DataSourceConnectionProvider
一般來說沒有更好的選擇 。 為了理解DataSourceConnectionProvider
(實現),您必須了解ConnectionProvider
(其規范)。 它是jOOQ用於兩件事的SPI:
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.