
99%가 모른다는 DB Connection 누수 문제
두줄요약
짧은 HikariCP max-lifetime과 mysql-connector-j 정리 스레드 병목으로 발생한 Connection 누수를 분석했습니다.\n드라이버 업그레이드와 정리 스레드 비활성화로 OOM 문제를 해결했습니다.
문제 상황
- MariaDB에서 MySQL JDBC Driver 변경 후 AWS EC2의 주기적 OOM과 인스턴스 교체
- Old Gen 정체, New 영역 GC 반복, API 애플리케이션 점유 시간 급증
원인 분석
- Heap Dump에서
AbandonedConnectionCleanupThread와connectionFinalizerPhantomRefs에 대량 적재된ConnectionImpl확인 - 단일 스레드 기반 네트워크 리소스 정리 속도가 50초
max-lifetime에 따른 빠른 Connection 재생성 속도를 미추월 PhantomReference와ReferenceQueue기반 정리 대기 객체의 누적으로 메모리 점유 확대
해결 방법
max-lifetime증가 또는 mysql-connector-j 8.0.22 이상 업그레이드 후 정리 스레드 비활성화- JVM 옵션
-Dcom.mysql.cj.disableAbandonedConnectionCleanup=true적용 - 옵션 적용 뒤 Heap Dump 내 정리 스레드 기반 메모리 점유 제거와 수개월간 안정 운영 확인
주의할 점
- DB 쿼리 시간보다 애플리케이션 점유 시간이 긴 요청과 GC 이상 징후 관찰
- 트래픽 급증으로 오인하기 쉬운 OOM 장애에서 Heap Dump 우선 분석

