명령 사이에 긴 간격이 있을 경우
테스트 서버의 로그에서 아래 이미지와 같은
Possibly consider using a shorter maxLifetime value.
WARN 레벨의 로그가 발생
HikariPool
의 문제로 보이는데 커넥션 풀의 누수를 경고하는 것으로 예상하고 관련된 내용을 찾아보았다.
찾아본 결과 로그의 의미는 connection
을 갱신하고자 하는데 이미 닫힌 커넥션이라 어떤 행위도 할 수 없다라는 내용으로 확인했고, HikariCP의 connection
과 MySQL
과의 관계에 대해 알아보자.
maxLifeTime
은 Hikari pool에서 connection
이 살아있을 수 있는 시간입니다.connection
은 종료하지 않고 이미 닫혀있는 경우에만 제거connection
을 한번에 대량으로 종료하고 생성하면 비용이 많이든다.Connection time limit
보다 짧아야 한다.connection
이 살아있다.maxLifetime
은 최소 30초이상 설정 (미만이면 30분으로 변경)
wait_timeout
: 활동하지 않는 커넥션을 끊을때까지 서버가 대기하는 시간
-> 현재 sleep 상태인 Connection을 끊는 주기
위의 내용을 토대로 로그의 원인은 MySQL의
wait_timeout
은 경과되어connection
에서 어떤 동작도 할 수 없다는 것을 알려준다.
지금 테스트 서버 RDS
의 wait_timeout
은 1분 3초였다.
HikariCP의 Connection
은 따로 application.yml
에 없는 것으로 보아 기본 값인 30분이었다.
그래서 application.yml
에서 maxLifetime
을 1분으로 설정했다
(max-lifetime
은 네트워크 통신 등을 감안해서 Database의 wait_timeout
으로 부터 2~3초 정도 짧게 주는걸 권장한다.)
이제 이전 요청 하고 30분 뒤에 요청한 후 로그를 확인하면
이전에 있었던 Failed to validate connection WARN
로그가 사라졌다.