programing

테스트 실행 시 스프링 부트 "PSQLException: FATAL: 미안, 너무 많은 클라이언트"

easyjava 2023. 3. 15. 20:01
반응형

테스트 실행 시 스프링 부트 "PSQLException: FATAL: 미안, 너무 많은 클라이언트"

프런트엔드에 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 쪽에 있지 않아야 합니다.

있다max_connections = 200 집에서는postgresql.conf 실행 이 훨씬 더 많이 나타납니다.pg_stat_activity더 많은 정보를 얻을 수 있습니다.으로는 그 때문에 했을 때PSQLException「90~100」에서는, 90~ 정도의 아이돌 접속을 볼 수 .pg_stat_activity그러면 다음 두 가지 문제가 발생합니다.

  1. 가 에 보다 더 많은 입니까?pg_stat_activity
  2. 데이터 내 데이터 소스 설정으로 되어 있는 것 같습니다.application.properties 그런지 왜런런 측측? ???

아직 답변이 없어서 해결책을 올립니다.짧은 버전: 테스트 속성에서 연결 풀 크기를 줄입니다.

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

Spring Boot 2: Spring Boot 2의 HikariCP. '2019년 1월 10일'많은 IT를 실행하는 동안 스프링 콘텍스트가 여러 번 생성됩니다.즉, 각 콘텍스트는 데이터베이스에서 10개의 접속을 취득합니다.제가 관찰한 바로는 테스트에서는 릴리스된 것보다 더 빨리 연결이 할당됩니다.therefore그 、max_connections데이터베이스 서버에서 허용되는 제한(일반적으로 기본 100)에 도달하면 "너무 많은 클라이언트" 오류가 발생합니다.

테스트 속성에서 연결 풀 크기를 2로 제한함으로써 그 문제를 해결할 수 있었습니다.

를 변경해야 합니다.minimum-idle속성 대신maximum-pool-size

spring.datasource.hikari.minimum-idle=5

디폴트값maximum-pool-size10, 그리고minimum-idle기본값은 max-pool-size와 동일합니다.max-pool-size보다 작은 값으로 변경해도 효과가 있었습니다.

어플리케이션은 테스트를 실행할 때 병렬로 실행할 때 DB에 많은 연결을 시도합니다.단, 이러한 접속은 매우 짧은 기간 동안 사용되며 하나의 접속은 여러 테스트인스턴스에서 쉽게 재사용할 수 있습니다.를 지정함으로써minimum-idle속성을 max-pool size보다 작은 값으로 설정합니다.HikariCP는 아이돌 접속 수가 임계값보다 낮을 경우에만 연결을 추가하도록 지시하고 있습니다.이것에 의해, 접속 풀이 포화 상태가 되어, 결과적으로 너무 많은 클라이언트의 시나리오가 발생하는 것을 막을 수 있습니다.

단, HikariCP에서는 이 설정을 하지 않는 이 좋습니다.minimum-idle급증하는 수요에 대한 성능과 응답성을 극대화할 수 있습니다.테스트를 실행하려고 할 때 문제에 직면했기 때문에 테스트 환경만을 위해 속성을 변경했습니다.

히카리의 Github Page가 꽤 도움이 되는 것 같습니다.이 파라미터는 모두 간단한 설명과 함께 기재되어 있습니다.꼭 보세요!

는 Egemen이 제안한 것을 포함하여 여러 가지 해결책을 시도했지만 효과가 없었다.

은 이 풀 크기를 제한하는 이었습니다.application-test.properties:

spring.datasource.maximumPoolSize=2

Spring Boot 어플리케이션 통합 테스트 및 테스트컨테이너 사용 시 이 문제가 발생하였습니다.접속 누설이 원인이 된 것을 깨달았습니다.

IMO 를 실행하는 가장 좋은 방법은, 열려 있는 모든 접속이 코드로 닫히고 있는 것을 확인하는 것입니다.

언급URL : https://stackoverflow.com/questions/47141176/spring-boot-psqlexception-fatal-sorry-too-many-clients-already-when-running

반응형