
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%';
[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분으로 적용됨) 재배포 후 로그 모니터링 결과 해당 오류는 더 이상 나타나지 않았다.
'BackEnd > Spring' 카테고리의 다른 글
Slack Chat API 사용하여 슬랙 알림 메시지 전송 (0) | 2023.02.27 |
---|---|
Static 변수에 @Value Injection 하기 (0) | 2023.01.15 |
Spring Gradle logback.xml 설정하여 로그 파일 저장하기 (0) | 2022.11.12 |
STS4 SpringBoot Gradle 프로젝트 생성 (0) | 2021.12.01 |