코딩마을방범대

HikariCP에서 발생하는 연결이 반복해서 열리고 닫히는 현상 본문

🎃 기타/상식 ❗

HikariCP에서 발생하는 연결이 반복해서 열리고 닫히는 현상

신짱구 5세 2024. 8. 29. 11:13
728x90

 

 

 

애플리케이션 테스트 중에 아래와 같이 connection이 여러번 재연결을 반복하는 로그를 발견해서 해결 방법을 찾기 시작했다.

 

[24-08-29 10:25:36.142][HikariCP connection adder][INFO ][n.s.l.l.s.Slf4jSpyLogDelegator.connectionOpened()] 12. Connection opened (Slf4jSpyLogDelegator.java:541)
[24-08-29 10:25:36.245][HikariCP connection adder][DEBUG][c.z.h.p.HikariPool$PoolEntryCreator.call()] HikariCP - Added connection net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@44188529 (HikariPool.java:709)
[24-08-29 10:25:36.524][HikariCP connection closer][DEBUG][c.z.h.pool.PoolBase.quietlyCloseConnection()] HikariCP - Closing connection net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@56403426: (connection has passed maxLifetime) (PoolBase.java:129)
[24-08-29 10:25:36.526][HikariCP connection closer][INFO ][n.s.l.l.s.Slf4jSpyLogDelegator.connectionClosed()] 6. Connection closed (Slf4jSpyLogDelegator.java:568)
[24-08-29 10:25:37.702][HikariCP connection adder][INFO ][n.s.l.l.s.Slf4jSpyLogDelegator.connectionOpened()] 13. Connection opened (Slf4jSpyLogDelegator.java:541)
[24-08-29 10:25:37.805][HikariCP connection adder][DEBUG][c.z.h.p.HikariPool$PoolEntryCreator.call()] HikariCP - Added connection net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@650a705d (HikariPool.java:709)
[24-08-29 10:25:38.374][HikariCP connection closer][DEBUG][c.z.h.pool.PoolBase.quietlyCloseConnection()] HikariCP - Closing connection net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy@4c07a7c3: (connection has passed maxLifetime) (PoolBase.java:129)
[24-08-29 10:25:38.380][HikariCP connection closer][INFO ][n.s.l.l.s.Slf4jSpyLogDelegator.connectionClosed()] 5. Connection closed (Slf4jSpyLogDelegator.java:568)

 

위 현상에 대한 원인으로는 내가 알아봤을 때 두 가지 경우가 있었다.

 

  1. maxLifetime 혹은 connectionTimeout 설정이 너무 낮게 설정되어 있을 경우
  2. 데이터베이스의 연결 제한이나 타임아웃 설정이 HikariCP와 충돌할 경우

 

어찌됐거나 타임아웃이 문제라는 소리인데, MySQL과 war에 설정되어있는 yml 파일만 확인하면 된다.

yml을 보면 아래와 같이 hikari 설정 부분이 있는 것을 확인할 수 있다.

 

spring:
      datasource:
            hikari:
                  pool-name: HikariCP
                  maximum-pool-size: 10
                  connection-timeout: 30000
                  max-lifetime: 1800000

 

 

이제 MySQL의 설정을 확인하려면 아래 명령어를 입력해주면 된다.

값을 확인하였을 때 yml에 설정되어있는 max-lifetime 값이 MySQL의 설정값보다 작으면 이런 현상이 발생할 수 있다.

 

SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';

 

 

나의 경우 max-lifetime를 MySQL에 설정되어있는 타임아웃 시간과 동일하게 설정해주었더니 정상적인 connection으로 구동될 수 있었다.

 

 

728x90