본문 바로가기

Spring Boot

hikariCP 커넥션 누수 탐지 및 QueryDsl의 transform 커넥션 누수 이슈 해결

728x90

문제 발견

개발을 진행하던 도중 간헐적으로

아래와 같은 타임아웃 오류가 발생하며 서버가 먹통이 되는 경우 발생함

hikari-pool-1 – Connection is not available, request timed out

 

원인 분석

사용가능한 커넥션이 없는 것으로 보이는데 현재 커넥션풀 사이즈를 20으로 세팅하였고,

커넥션이 모자라서 데드락이 걸릴 상황도 아님

 

우선 실제로 커넥션풀의 20개 커넥션이 모두 사용되는지 확인하기 위해 hikari 로그 출력 설정을 추가함

logging:
  level:
    com.zaxxer.hikari.HikariConfig: DEBUG
    com.zaxxer.hikari: TRACE

추가 후 실행하여 사이트 여기저기 돌아다니다 보니

아래와 같이 커넥션 풀의 idle 커넥션이 0으로 수렴하는것을 확인함

사이즈가 20인 커넥션풀의 idle 커넥션이 0이 된 상황

 

따라서, 어디선가 누수가 있을 것으로 예상하였음

커넥션 누수를 발견하기 위해 hikari 세팅에 아래와 같은 옵션을 추가

datasource:
  hikari:
    leak-detection-threshold: 2000

 

서버 재실행 후 다시 여기저기 페이지들 확인해보니 아래와 같은 로그 발견 (위 옵션에 지정된 2초가 지나는 경우 검출됨)

누수(leak) 검출 로그

문제 해결

우리의 경우 QueryDsl 의 transform 기능 사용 시 커넥션 누수가 일어나고 있었고,

해결 방법은 transform을 사용하는 메서드에 @Transactional 어노테이션을 붙여주면 됨

 

 

ps.

위 내용은 이전에 발견했었던 이슈였지만 직접 원인 분석을 해보고 싶어서 내용들을 찾아보니

커넥션 누수와 관련이 있었고, 이는 로그 옵션 추가로 아주 간단하게 발견할 수 있었음

 

나도 모르게 커넥션 누수를 방치할 수 있으니, 로컬설정에 leak-detecion 옵션 넣어두면 좋을듯!

 

 

참고 사이트 :

커넥션 탐지 로그, https://imksh.com/73

 

[Spring] HikariCP Dead lock 벗어나기

22.06.04) 해당 글은 Dead Lock이 아닌 단순 커넥션 누수의 문제입니다. ※ Hikari, Connections pool, dead lock에 대한 설명이 포함되어 있지 않습니다 결론부터 말하자면 저의 경우엔 개발자의 실수였습니다.

imksh.com

QueryDsl의 transform 관련 커넥션 누수 이슈, https://colin-d.medium.com/querydsl-%EC%97%90%EC%84%9C-db-connection-leak-%EC%9D%B4%EC%8A%88-40d426fd4337

 

Querydsl 에서 DB connection leak 이슈

Elasticsearch에 색인하는 배치 서버에 신규 기능을 추가하고 있던 중 코드 작성을 완료하고 테스트를 시작하고 난 후에 계속해서 JDBC ConnectionException 이 발생하였다.

colin-d.medium.com

 

728x90