코딩마을방범대
HikariCP에서 발생하는 연결이 반복해서 열리고 닫히는 현상 본문
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)
위 현상에 대한 원인으로는 내가 알아봤을 때 두 가지 경우가 있었다.
- maxLifetime 혹은 connectionTimeout 설정이 너무 낮게 설정되어 있을 경우
- 데이터베이스의 연결 제한이나 타임아웃 설정이 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
'🎃 기타 > 상식 ❗' 카테고리의 다른 글
[JAVA] 원시타입(Primitive Type)과 참조타입(Reference Type) & Object와 Wrapper (0) | 2024.09.27 |
---|---|
[JAVA] 메서드 정의의 기본 구조 (0) | 2024.09.27 |
DDD(Domain Driven Design) 개념 (0) | 2024.05.22 |
Binary 로그란 (0) | 2024.05.20 |
데이터베이스 리플리케이션(Replication) (0) | 2024.05.20 |