我有一个Spring Boot应用程序,提供REST API给前端。我正在使用jOOQ和Postgresql。当前在本地执行所有集成测试时(大约1000个测试,在执行700-800个测试后开始出现此错误)遇到以下错误:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
我尝试通过 application.properties
来限制最大空闲连接数和最大活动连接数,但是似乎这些值有点被忽略了。在执行测试时,我使用以下语句来监视开放的连接:
SELECT datname, state, query FROM pg_stat_activity;
这是我的application.properties文件的样子:
spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/xxx
spring.datasource.username = xxx
spring.datasource.password = xxx
spring.datasource.initialize = true
spring.datasource.continue-on-error = false
spring.jooq.sql-dialect = POSTGRES
spring.datasource.max-active = 50
spring.datasource.max-idle = 5
这就是我创建数据源的方式:
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource() {
return DataSourceBuilder
.create()
.build();
}
我看到jOOQ使用了正确的数据源,连接也由jOOQ正确处理(从数据源获取和释放连接)。所以问题不应该在jOOQ这一侧。
我的postgresql.conf
中有max_connections = 200
,所以我的Spring配置应该没问题。在运行测试时,我发现pg_stat_activity
中的空闲连接比我在配置文件中指定的要多得多。最终,当测试因PSQLException
失败时,我在pg_stat_activity
中看到大约90-100个空闲连接。所以这带来了两个问题:
- 为什么我的测试会失败,尽管我的本地数据库应该允许更多的连接,而不是我在
pg_stat_activity
中看到的数量? - 似乎我的
application.properties
中的数据源配置被忽略了。有什么想法吗?
spring.datasource.max-active = 20
:我认为这是一个打字错误。 - davidxxxpostgresql.conf
中max_connections
的配置值是 200。在我的application.properties
文件中,我尝试了各种 max-active 和 max-idle 的组合(我还尝试了将 max-active 设置为 max_connections 并且不指定 max-idle),但我总是遇到 PSQLException 异常。当我收到异常时,从pg_stat_activity
中获取的结果在 90 到 100 之间。 - Egemen