본문 바로가기

database

HikariCP - max lifetime과 DB wait_timeout의 관계

이전 글에서 maximum pool size와 db max connections size의 관계를 살펴보면서, HikariCP의 maximum pool size를 어떻게 조정해야 좋은지 살펴보았다. pool size를 조정하는 것은 db와 connection을 맺은 connection을 얼마나 관리할 것인가에 관심이 있다면, 이제 살펴볼 max lifetime은 pool에서 관리할 connection의 생명주기를 어떻게 가져갈 것인가 하는 문제에 관심이 있다.

 

max lifetime은 어떻게 설정해야 할까?

다음 블로그 글에서 max lifetime 설정에 대해서 자세히 설명하고 있다. 결론부터 말하자면 max lifetime의 값을 db wait_timeout 보다 최소 2~5초는 짧게 설정하는 것이 좋다. 만약 db의 wait_timeout 값이 더 작다면, db 서버는 커넥션을 종료했지만 client app에서는 connection이 살아 있다고 보기 때문에 connection 누수가 일어날 수 있기 때문이다.(db가 연결을 끊어버렸기 때문에 client에서 어떤 요청을 보내더라도 아무 의미 없이 자원을 낭비하는 꼴이다)

 

max lifetime < db wait timeout

client app의 connection max lifetime이 정상적으로 db의 wait timeout 보다 짧은 정상 상태다.  HikariCP의 max-lifetime은 default 180,000(ms) 30분이고, DB wait_timeout은 default 28800(s) 8시간이다. 설정을 건드리지 않았다면 max lifetime이 충분히 작다.

 

max lifetime > db wait timeout

max-lifetime은 기본 30분을 유지하고, DB wait_timeout 값을 20초로 설정했다.

# mysql sql
SET GLOBAL wait_timeout = 20;
SET SESSION wait_timeout = 20;  # 현재 session에도 함께 적용

 

최초 HikariCP가 DB와 커넥션을 맺었을 때는 다음과 같이 default connection pool size에 해당하는 10개의 커넥션을 맺었다.

 

이후 DB wait_timeout 20초 동안 아무런 요청도 보내지 않았기 때문에 timeout 되어 모든 커넥션을 종료하여 더 이상의 커넥션이 남아 있지 않게 되었다.

 

마치며

HikariCP에서 connection pooling을 통해 DB 서버와 기본적으로 connection을 수립해두는 이유는 connection 수립 비용이 상대적으로 비싸기 때문이다. 만약 max lifetime 값 이상의 유휴 시간이 있는 서비스가 있다면, 요청을 처리할 때 connection을 다시 맺어야 하는 자원이 소모될 것이다.

 

[참고]

HikariCP Failed to Validate Connection Warning 이야기 - Carry's 기술블로그

https://github.com/brettwooldridge/HikariCP