使用 jOOQ 和 Spring Boot 进行集成测试时出现“PSQLException: FATAL: sorry, too many clients already”错误
Posted
技术标签:
【中文标题】使用 jOOQ 和 Spring Boot 进行集成测试时出现“PSQLException: FATAL: sorry, too many clients already”错误【英文标题】:"PSQLException: FATAL: sorry, too many clients already" error in integration tests with jOOQ & Spring Boot 【发布时间】:2018-04-05 07:12:49 【问题描述】:已经有关于这个错误的类似问题和建议的解决方案;例如在postgresql.conf
中增加max_connections
和/或调整您的应用请求的最大连接数。但是,我的问题更具体到在 Spring Boot 应用程序中使用 jOOQ。
我将 jOOQ 集成到我的应用程序中,如 GitHub 上的示例所示。即,我使用DataSourceConnectionProvider
和TransactionAwareDataSourceProxy
来处理数据库连接,并在需要它的类中注入DSLContext
。
我的应用程序为前端提供各种 Web 服务,到目前为止,我从未在开发或测试环境中遇到过 PSQLException。我只是在本地运行所有集成测试(大约 1000 个)时才开始出现该错误。由于 Spring 和 jOOQ 管理资源,我不希望在处理连接时出现泄漏;然而,这个错误让我担心这是否也会在生产中发生。
长话短说,有没有比使用DataSourceConnectionProvider
管理连接更好的选择? 请注意,我已经尝试过使用DefaultConnectionProvider
,并尝试使spring.datasource.max-active
小于@ Postgres 允许 987654330@。到目前为止都没有解决我的问题。
【问题讨论】:
【参考方案1】:由于您的问题似乎不是关于使用 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 相关的问题,而是与您的数据源相关的问题。
【讨论】:
感谢卢卡斯的回答。DataSourceConnectionProvider
似乎为我提供了所需的行为,我会坚持下去。到目前为止,我一直在使用 Spring 创建的默认数据源,其默认值例如最大 100 个空闲和活动连接。然后我将调整配置以进行集成测试;根据您的回复,我不需要更改任何代码。以上是关于使用 jOOQ 和 Spring Boot 进行集成测试时出现“PSQLException: FATAL: sorry, too many clients already”错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot 进行 JOOQ SQL 语法转换
使用 jOOQ 和 Spring Boot 进行集成测试时出现“PSQLException: FATAL: sorry, too many clients already”错误
jooQ spring boot Multiple Schema(读写拆分)
Spring Boot with JOOQ 和 Spring Data JPA 之间的技术差异