gpt4 book ai didi

postgresql - 使用 jOOQ 和 Spring Boot 进行集成测试时出现 "PSQLException: FATAL: sorry, too many clients already"错误

转载 作者:行者123 更新时间:2023-11-29 11:46:52 24 4
gpt4 key购买 nike

已经有关于此错误的类似问题和建议的解决方案;例如增加 postgresql.conf 中的 max_connections 和/或调整应用请求的最大连接数。但是,我的问题更具体地针对在 Spring Boot 应用程序中使用 jOOQ。

我将 jOOQ 集成到我的应用程序中,如 GitHub 上的示例所示.即,我将 DataSourceConnectionProviderTransactionAwareDataSourceProxy 一起使用来处理数据库连接,并将 DSLContext 注入(inject)到需要它的类中。

我的应用程序为前端提供各种 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.getConnection() 从您的 DataSource 获取连接来实现此目的并通过 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 相关的问题,而是与您的数据源有关。

关于postgresql - 使用 jOOQ 和 Spring Boot 进行集成测试时出现 "PSQLException: FATAL: sorry, too many clients already"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46911365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com