Post

HikariCP

HikariCP

Hikari Connection Pool 또는 HikariCP는 가장 인기있는 JDBC(Java Database Connectivity) 커넥션 풀링 프레임워크 중 하나이다. HikariCP는 빠르고 간단하며 안정적이라는 점이 충분히 검증되어서 스프링 부트의 기본 DBCP로 채택되었다. -> Down the Rabbit Hole - HikariCP

Spring Boot 2.XX부터 HikariCP는 기본 DataSource 구현이며 연결 풀링 메커니즘을 제공한다. Spring Boot의 발견 알고리즘은 TomcatJDBC를 통해 Hikari를 DataSource 구현으로 자동으로 결정하는 반면, 우리는 프로젝트에서 spring-data-starter-jpa 종속성을 사용합니다.

Configuring HikariCP

연결 시간 초과 이 속성의 값은 Spring Boot 애플리케이션이 데이터베이스 연결 풀에서 연결을 기다리는 밀리초 수를 제어합니다. 연결이 사용 가능하지 않은 채 이 시간을 초과하면 SQLException이 발생합니다. 허용되는 가장 낮은 연결 시간 초과는 250밀리초입니다. 기본값은 30000밀리초(30초)입니다 .

최대 풀 크기 이 속성의 값은 Spring Boot 애플리케이션에서 데이터베이스로 설정할 수 있는 실제 연결의 최대 수를 제어합니다. 데이터베이스에서 쿼리하기 위해 Spring Boot 애플리케이션에 도착한 요청의 양이나 데이터베이스에서 읽기/쓰기 작업을 수행하기 위해 애플리케이션에서 생성된 스레드의 양에 관계없이 Hikari는 설정된 연결 수가 maximum-pool-size 속성에 지정된 값을 넘지 않도록 합니다. 기본값은 10입니다. 즉, 최대 풀 크기는 10입니다.

최소 유휴 이 속성의 값은 연결 풀에서 항상 유지되어야 하는 최소 연결 수를 제어합니다. 이 속성의 값이 4로 설정된 경우, 이 Spring Boot 애플리케이션의 연결 풀에는 항상 데이터베이스 작업을 수행할 수 있는 4개의 데이터베이스 연결이 있습니다. 기본값은 maximum-pool-size와 동일합니다.

최대 수명 이 속성의 값은 연결이 연결 풀에서 얼마나 오래 유지되는지 결정합니다. 이 값은 유휴 상태인 연결에만 적용되며, 사용 중인 연결은 절대로 폐기되지 않습니다. 값 0은 최대 수명 없음(무한 수명)을 나타냅니다. 허용되는 최소값은 30000밀리초(30초)입니다. 기본값은 1800000밀리초(30분)입니다.

유휴 시간 초과 이 속성의 값은 연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간을 제어합니다. 이 설정은 minimum-idle이 maximum-pool-size보다 작게 정의된 경우에만 적용됩니다. 예를 들어, maximum-pool-size의 값이 8이고 minimum-idle이 4라고 가정해 보겠습니다. Spring Boot 애플리케이션은 6개의 동시 스레드에 대해 데이터베이스 작업을 수행해야 합니다. 따라서 Spring Boot 애플리케이션은 데이터베이스와 6개의 실제 연결을 설정합니다. 6개 스레드에 대해 모든 데이터베이스 관련 작업이 수행되면 풀에 6개의 유휴 연결이 있게 됩니다. 이제 HikariCP는 minimum-idle 속성의 값을 확인하고 풀에서 유휴 연결 수를 조정하려고 합니다. 이 예에서 minimum-idle의 값은 4이므로 HikariCP는 풀에서 2개의 유휴 연결을 제거하여 유휴 연결 수를 4로 만듭니다. 그러나 필요한 수의 유휴 연결을 풀에서 제거하기 전에 HikariCP는 유휴 시간 제한에 지정된 시간까지 해당 추가 연결을 풀에 보관합니다. 이 시간 초과 전에는 연결이 유휴로 폐기되지 않습니다. 값 0은 유휴 연결이 풀에서 제거되지 않음을 의미합니다. 허용되는 최소값은 10000밀리초(10초)입니다. 기본값은 600000밀리초(10분)입니다.

누출 감지 임계값 이 속성은 연결 누수 가능성을 나타내는 메시지가 기록되기 전에 연결이 풀에서 벗어날 수 있는 시간을 제어합니다. 값 0은 누수 감지가 비활성화됨을 의미합니다. 누수 감지를 활성화하는 데 허용되는 가장 낮은 값은 2000밀리초(2초)입니다. 기본값은 0입니다.

일반적인 오류 및 가능한 이유 몇 가지 일반적인 오류와 그 발생 이유는 아래와 같습니다.

연결이 끊어졌습니다

이유 : 이러한 유형의 오류가 표시되는 가능한 이유는 다음과 같습니다.

1) 데이터베이스 측의 최대 연결 수명은 Spring Boot 애플리케이션의 Hikari 구성의 최대 수명보다 짧습니다.

2) Spring Boot 애플리케이션과 데이터베이스가 네트워크를 통해 연결되어 있는 경우 TCP 연결 시간 초과도 이 오류의 원인일 수 있습니다.

해결책 : TCP 연결의 타임아웃 또는 데이터베이스 연결 타임아웃에 따라 max-lifetime 속성의 값을 조정해야 합니다. 유사한 토론 링크: https://github.com/brettwooldridge/HikariCP/issues/1326

연결 누수 감지가 트리거됨 | 명백한 연결 누수 감지됨

이유 : 이 문제는 누수 감지 임계값 속성의 값이 낮아서 발생할 수 있습니다(쿼리에 훨씬 더 많은 시간이 걸릴 수 있음).

해결책 : 누출 감지 임계값을 조정해야 합니다. 60000밀리초(1분) 이상으로 늘려보세요.

연결이 제거되었습니다

이유 : HikariCP가 풀에서 만료되거나 유휴 연결을 제거하는 동안 이 오류가 표시되는 가능한 원인은 추가 스레드를 희생하여 사전 연결 제거를 보장합니다. 유사한 토론 링크: https://stackoverflow.com/questions/42438970/connection-eviction-strategy-in-http-connection-pooling-in-java

References

This post is licensed under CC BY 4.0 by the author.