gpt4 book ai didi

postgresql - 运行测试时 Spring Boot "PSQLException: FATAL: sorry, too many clients already"

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

我有一个为前端提供 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 个空闲连接。所以这会产生两个问题:

  1. 为什么我的测试会失败,尽管我的本地数据库应该允许比我在 pg_stat_activity 中看到的更多的连接?
  2. 似乎忽略了我的application.properties 中的数据源配置。知道为什么吗?

最佳答案

由于没有建议的答案,我发布了我的解决方案。简短版本:减少测试属性中的连接池大小:

spring.datasource.hikari.maximum-pool-size=2

更长的版本:Spring Boot 2 默认使用 HikariCP 作为连接池,连接池大小的默认值为 10(截至 2019 年 1 月)。在运行大量 IT 时,会多次创建 Spring 上下文,这意味着每个上下文从数据库获取 10 个连接。据我观察,测试分配连接的速度比释放连接的速度快。因此,数据库服务器允许的 max_connections 限制(默认情况下通常为 100)在某个时候达到,这会导致“客户端过多”错误。

通过在测试属性中将连接池大小限制为 2,我能够解决该问题。

关于postgresql - 运行测试时 Spring Boot "PSQLException: FATAL: sorry, too many clients already",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47141176/

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