使用 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 上的示例所示。即,我使用DataSourceConnectionProviderTransactionAwareDataSourceProxy 来处理数据库连接,并在需要它的类中注入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 通过从DataSourceDataSource.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 之间的技术差异

带有 testcontainers 和 jOOQ 的 Spring Boot 不会注入 DSL 上下文

如何使用 Spring-Boot config 配置 JOOQ 设置?