문제 발견
개발을 진행하던 도중 간헐적으로
아래와 같은 타임아웃 오류가 발생하며 서버가 먹통이 되는 경우 발생함
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으로 수렴하는것을 확인함
따라서, 어디선가 누수가 있을 것으로 예상하였음
커넥션 누수를 발견하기 위해 hikari 세팅에 아래와 같은 옵션을 추가함
datasource:
hikari:
leak-detection-threshold: 2000
서버 재실행 후 다시 여기저기 페이지들 확인해보니 아래와 같은 로그 발견 (위 옵션에 지정된 2초가 지나는 경우 검출됨)
문제 해결
우리의 경우 QueryDsl 의 transform 기능 사용 시 커넥션 누수가 일어나고 있었고,
해결 방법은 transform을 사용하는 메서드에 @Transactional 어노테이션을 붙여주면 됨
ps.
위 내용은 이전에 발견했었던 이슈였지만 직접 원인 분석을 해보고 싶어서 내용들을 찾아보니
커넥션 누수와 관련이 있었고, 이는 로그 옵션 추가로 아주 간단하게 발견할 수 있었음
나도 모르게 커넥션 누수를 방치할 수 있으니, 로컬설정에 leak-detecion 옵션 넣어두면 좋을듯!
참고 사이트 :
커넥션 탐지 로그, https://imksh.com/73
QueryDsl의 transform 관련 커넥션 누수 이슈, https://colin-d.medium.com/querydsl-%EC%97%90%EC%84%9C-db-connection-leak-%EC%9D%B4%EC%8A%88-40d426fd4337
'Spring Boot' 카테고리의 다른 글
[Spring Security] Multi Tenancy 환경에 Remember Me 적용하기 (0) | 2022.10.05 |
---|---|
[Spring Security] Run-As로 임시 권한 부여하기 (0) | 2022.08.19 |
[Spring Boot] Optional의 orElse(), orElseGet() 알고 쓰기 (0) | 2022.08.11 |
[Spring Boot] WebSecurityConfigurerAdapter Deprecated 대처 (1) | 2022.08.10 |
[튜토리얼] IntelliJ로 CRUD 구현하기 (0) | 2022.08.08 |