Spring HikariPool Failed to validate connection

따봉도관절

·

2022. 11. 11. 00:12

Hikari CP와 DataBase의 Connection 관계 이해도가 낮아 해당 오류를 해결하는데 시간이 조금 걸렸다.

 


원인 : Hikari CP에선 Thread가 Connection을 요청하면 최초 연결 이후 해당 Connection을 CP(Connection Pool)에 담아놓고 재요청이 들어왔을 때 담아두었던 해당 Connection을 연결해준다. 불필요한 Connection 시도를 줄일 수 있어 효율적이지만 DataBase에서 Connection을 끊어버리면 Hikari CP에선 해당 사실을 알 수가 없어 연결 중이라 착각하고 끊긴 Connection을 연결해주는 과정에서 발생하는 오류이다.

 

해결 : 위 로그 내용 중 Possibly consider using a shorter maxLifetime value 에서 힌트를 얻을 수 있었다.

해결 방법은 Hikari CP MaxLifeTime을 DataBase의 wait_timeout 보다 짧게 설정하는 것이다.


[STEP 1] DataBase(MySQL)의 wait_timeout 시간을 확인

 

show global variables like '%time%';

 

mysql의 wait_timeout 설정 시간은 30초이다.(default: 8시간)

 

[STEP 2] /src/main/resources/application.properties 파일에 maxLifetime 설정 추가

 

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/testdb?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.username=test
spring.datasource.password=gcpower123!
spring.datasource.maxLifetime=30000
spring.datasource.connection-timeout=10000

hikari CP maxLifetime 시간은 보통 DB wait_timeout 보다 2~5초 정도 더 짧게 설정하는 걸 권장한다고 한다.

내가 작업하는 MySQL 환경은 wait_timeout이 30초였으며 hikari CP maxLifetime최소 30초 이상 설정해주어야 적용이 된다. (30초 보다 짧게 잡으면 default 30분으로 적용됨) 재배포 후 로그 모니터링 결과 해당 오류는 더 이상 나타나지 않았다.