关于此错误和建议的解决方案已经有类似的问题;例如在max_connections
中增加postgresql.conf
和/或调整应用请求的最大连接数。但是,我的问题更具体地说是在Spring Boot应用程序中使用jOOQ。
我将jOOQ集成到我的应用程序中,如GitHub上的示例所示。也就是说,我使用DataSourceConnectionProvider
和TransactionAwareDataSourceProxy
来处理数据库连接,并将DSLContext
注入需要它的类中。
我的应用程序为前端提供了各种Web服务,到目前为止我从未在开发或测试环境中遇到过PSQLException。我在本地运行所有集成测试(大约1000)时才开始出错。我不希望在处理连接时出现一些泄漏,因为Spring和jOOQ管理资源;尽管如此,这个错误让我担心,如果这也会在生产上发生。
长话短说,是否有更好的替代方法来使用DataSourceConnectionProvider
来管理连接?请注意,我已尝试使用DefaultConnectionProvider
,并尝试制作{{ 1}}小于Postgres允许的spring.datasource.max-active
。到目前为止,我的问题都没有解决。
答案 0 :(得分:2)
由于您的问题似乎不是关于使用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相关的问题,而是与您的数据源相关的问题。