Spring

Failed to validate connection 해결하기

누구세연 2024. 8. 17. 10:11

애플리케이션 실행 중에 warning 센트리 알림이 울리기 시작했다..😅

오류 메시지의 원인 및 해결 방안을 알아보도록 하겠습니다.

warning

이 오류 메시지는 HikariCP에서 MySQL 데이터베이스를 연결을 관리하는 동안 발생한 문제를 나타냅니다.

구체적으로 MySQL 연결이 이미 닫힌 상태에서 HikariCP가 해당 연결을 사용하려고 시도했기 때문에 발생한 문제입니다.

이 문제는 주로 연결 수명이 다한 후에도 HikariCP가 그 연결을 풀에서 사용하려고 시도하는 경우 발생합니다.

 

원인

  1. 연결 수명이 만료됨
    MySQL 서버에서 연결이 유효 기간이 지나서 닫히면, HikariCP는 해당 연결을 사용하려고 할 때 문제가 발생합니다.
    MySQL 서버의 wait_timeout 설정이 짧게 설정되어 있는 경우 이 문제가 발생할 수 있습니다.
  2. 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`를 설정하여 연결의 유효성을 더 확실하게 관리할 수 있습니다.