서비스 운영 중 아래와 같은 경고 로그가 지속적으로 생겼다.
hikariPool - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@7aa2f8a6 ((conn=463456) Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
서비스가 동작하는데 특별한 문제는 없었지만, 자꾸 경고 로그가 발생하는 것이 거슬려서 해결해보기로 한다.
경고 로그 마지막에 using a shorter maxLifetime value 라는 것이 보여서 해당 키워드로 열심히 검색해봤다.
알아본 결과는 다음과 같다.
현재 DB로 사용하고 있는 RDS의 wait_timeout은 3분이다.
그러나 스프링 서버의 기본 커넥션 풀인 hikari CP는 max-lifetime이 30분인데, 여기서 문제가 발생한다.
RDS는 idle 상태의 커넥션을 wait_timeout이 지나면 연결을 종료한다.
스프링 서버는 idle 상태의 커넥션을 max-lifetime이 지나면 연결을 끊고 새로운 커넥션을 생성한다.
따라서, max-lifetime이 wait_timeout보다 짧아야 RDS가 커넥션을 끊기 전에 스프링 서버 스스로 연결을 끊고 새로운 커넥션을 맺기 때문에 문제가 발생하지 않는다.
실제로 hikari CP는 네트워크 지연을 고려하여 max-lifetime을 wait_timeout보다 2~3초 정도 짧게 줄 것을 권고한다.
스프링에서 다음과 설정을 추가하면 경고 로그는 없어진다.
spring:
datasource:
hikari:
max-lifetime: 177000 # 177초, hikari는 RDS wait_timeout(180초) 보다 2 ~ 3초 정도 짧게 줄 것을 권장
참고자료
https://velog.io/@jijang/Failed-to-validate-connection-처리
https://cmelcmel.tistory.com/111
'java > spring' 카테고리의 다른 글
[Spring] request multipart file size 조정 (0) | 2022.08.03 |
---|---|
[Spring] MariaDB connection 끊김 (0) | 2022.08.03 |
[Spring] AWS S3 객체 전체 조회 or 해당 level만 조회 (0) | 2022.08.01 |
[Spring] AWS S3 접근 (0) | 2022.07.25 |
[Spring] S3 Pre-Signed URL 생성 (0) | 2022.07.25 |