com.zaxxer.hikari.pool.PoolBase :
HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@7ce370be
(No operations allowed after connection closed.).
Possibly consider using a shorter maxLifetime value.
MySQL의 wait_timeout이 Hikari의 max_lifetime보다 작았기 때문에 발생했다.
Hikari의 default max_lifetime은 30분으로 되어있다.
하지만 MySQL의 wait_timeout 값은 3분으로 되어있었다. MySQL의 default wait_timeout 값은 28800초(8시간)인데 누군가 이 값을 임의로 바꾼 것 같다.
아래의 쿼리를 실행하면 확인할 수 있다.
show (global) variables like '%timeout%';
Hikari는 한번 connection을 생성하면 30분동안 유지하려 하는데
MySQL에서 wait_timeout을 3분으로 설정해줬기 때문에 3분이 지나면 connection을 반납한다.
Hikari가 아까 생성했던 connection을 잡아주려 하는데 이미 반납이 돼서 에러? 메시지가 출력된 것이다.
친절하게 해결 방법도 알려줬다. Possibly consider using a shorter maxLifetime value.
-> maxLifetime을 wait_timeout보다 더 짧게 설정해라.
maxLifetime을 더 짧게 설정할 수도 있지만 wait_timeout을 늘렸다.
첫번째 이유는 wait_timeout이 너무 짧으면 connection을 생성하고 해제하는데 비용이 많이 들 것 같다고 판단했다.
두번째 이유는 Hikari의 default max_lifetime을 근거없이 변경하고 싶지 않았다.
wait_timeout = max_lifetime + 2~5(s) = 1805
네트워크 통신하는데 걸리는 시간이나 connection 생성 및 할당 시간 등을 고려해서 넉넉하게 max_lifetime보다 5초정도 더 크게 잡았다.
set (global) wait_timeout = 1805;
set (global) interactive_timeout = 1805;
참고자료(확인한 글들 중에서 가장 이해가 되는 글이다.)
https://jaehun2841.github.io/2020/01/08/2020-01-08-hikari-pool-validate-connection/#maxlifetime-wait_timeout-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%84%A4%EC%A0%95%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94