애플리케이션 실행 중에 warning 센트리 알림이 울리기 시작했다..😅
오류 메시지의 원인 및 해결 방안을 알아보도록 하겠습니다.
이 오류 메시지는 HikariCP에서 MySQL 데이터베이스를 연결을 관리하는 동안 발생한 문제를 나타냅니다.
구체적으로 MySQL 연결이 이미 닫힌 상태에서 HikariCP가 해당 연결을 사용하려고 시도했기 때문에 발생한 문제입니다.
이 문제는 주로 연결 수명이 다한 후에도 HikariCP가 그 연결을 풀에서 사용하려고 시도하는 경우 발생합니다.
원인
- 연결 수명이 만료됨
MySQL 서버에서 연결이 유효 기간이 지나서 닫히면, HikariCP는 해당 연결을 사용하려고 할 때 문제가 발생합니다.
MySQL 서버의 wait_timeout 설정이 짧게 설정되어 있는 경우 이 문제가 발생할 수 있습니다. - HikariCP의 maxLifetime 설정
HikariCP의 maxLifetime 설정은 연결이 풀에서 최대 얼마나 오래 유지될 수 있는지를 정의합니다.
기본적으로 maxLifetime은 30분(1800000 ms)으로 설정되어 있습니다.
이 값이 MySQL의 연결 수명(wait_timeout) 보다 길다면, MySQL이 연결을 닫아버린 후에도 HikariCP는 그 연결을 사용하려고 시도할 수 있습니다.
해결방안
1. HikariCP의 maxLifetime 값 조정
maxLifetime 값을 MySQL 서버의 wait_timeout 값보다 짧게 설정해야 합니다. 이렇게 하면 MySQL 서버가 연결을 닫기 전에 HikariCP가 연결을 회수하고 새로운 연결을 생성할 수 있습니다.
예를 들어, Spring Boot 환경에서는 application.yml 파일에 다음과 같이 설정할 수 있습니다.
spring:
datasource:
hikari:
max-lifetime: 2700000 # 27분으로 설정 (MySQL wait_timeout보다 짧게 설정)
2. MySQL 서버의 wait_timeout 값 조정
MySQL 서버의 wait_timeout 설정을 확인하고 필요에 따라 값을 늘려 HikariCP가 연결을 사용하려는 동안 MySQL이 연결을 닫지 않도록 할 수 있습니다.
MySQL에서 wait_timeout 값을 확인하려면:
SHOW VARIABLES LIKE 'wait_timeout';
wait_timeout 값을 늘리려면:
SET GLOBAL wait_timeout = 28800; # 예: 8시간 (28800초)
3. HikariCP의 connectionTestQuery 설정
연결이 유효한지 확인하기 위해 HikariCP에서 connectionTestQuery를 설정할 수 있습니다. 이 옵션은 각 연결을 사용하기 전에 유효성을 검사하는 쿼리를 실행합니다.
spring:
datasource:
hikari:
connection-test-query: SELECT 1;
위의 HikariCP 설정이나 MySQL wait_timeout 설정을 할 때 유의할 점이 있다면 HikariCP maxLifetime는 millisecond, MySQL wait_timeout은 second 단위로 되어있습니다. 아래의 공식문서를 확인하고 설정하는 것이 좋습니다.
https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_wait_timeout
MySQL :: MySQL 8.4 Reference Manual :: 7.1.8 Server System Variables
dev.mysql.com
https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
GitHub - brettwooldridge/HikariCP: 光 HikariCP・A solid, high-performance, JDBC connection pool at last.
光 HikariCP・A solid, high-performance, JDBC connection pool at last. - brettwooldridge/HikariCP
github.com
결론
이 문제를 해결하려면 HikariCP의 `maxLifetime` 값을 MySQL의 `wait_timeout` 값보다 짧게 설정하거나, MySQL 서버의 `wait_timeout` 값을 늘려 연결을 적절히 관리되도록 조정하는 것이 필요합니다.
추가적으로 `connectionTestQuery`를 설정하여 연결의 유효성을 더 확실하게 관리할 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring] AOP에 @EnableAspectJAutoProxy는 왜 필요할까? (0) | 2024.09.07 |
---|---|
Spring Boot에서 WireMock을 사용해서 테스트하기 (0) | 2024.08.30 |
[Spring] @Scheduled 주기적인 작업 처리하기 (0) | 2024.07.27 |
[Spring] ArgumentResolver 사용하기 (0) | 2024.07.20 |
[Spring] Path Variable과 Query Parameter (2) | 2024.07.18 |