“PSQLException:致命:对不起,已经有太多客户”与jOOQ& amp;春季启动

时间:2017-10-24 13:03:45

标签: postgresql spring-boot jooq

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

我将jOOQ集成到我的应用程序中,如GitHub上的示例所示。也就是说,我使用DataSourceConnectionProviderTransactionAwareDataSourceProxy来处理数据库连接,并将DSLContext注入需要它的类中。

我的应用程序为前端提供了各种Web服务,到目前为止我从未在开发或测试环境中遇到过PSQLException。我在本地运行所有集成测试(大约1000)时才开始出错。我不希望在处理连接时出现一些泄漏,因为Spring和jOOQ管理资源;尽管如此,这个错误让我担心,如果这也会在生产上发生。

长话短说,是否有更好的替代方法来使用DataSourceConnectionProvider来管理连接?请注意,我已尝试使用DefaultConnectionProvider,并尝试制作{{ 1}}小于Postgres允许的spring.datasource.max-active。到目前为止,我的问题都没有解决。

1 个答案:

答案 0 :(得分:2)

由于您的问题似乎不是关于使用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相关的问题,而是与您的数据源相关的问题。