【发布时间】:2018-04-18 20:46:45
【问题描述】:
我有一个向前端提供 REST API 的 Spring Boot 应用程序。我正在使用 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:我认为这是一个错字。 -
@davidxxx 不,为什么?你的意思是max-active vs maxActive?两者都应该可以正常工作。
-
不在这一点上。我这么说是因为您指的是 PostgreSQL 中的最大连接数为 200。如果连接数超过
20,则会出现错误。不 ?实际上,您不知道当前打开了多少个连接,因为您有错误。这些信息会很有用。 -
@davidxxx 还指出你的 max-idle 大于你的 max-active,这并没有什么意义,所以看起来 max-active 的值不正确。
-
200 是我的
postgresql.conf中的max_connections配置。在我的application.properties中,我尝试了 max-active 和 max-idle 的各种组合(我也尝试了 max-active = max_connections 而没有指定 max-idle),但我总是遇到 PSQLException。当我收到异常时,我从pg_stat_activity得到 90 -100 个结果。
标签: postgresql spring-boot datasource