목록 보기
PoolCleaner를 활용한 Connection Pool 최적화
백엔드

PoolCleaner를 활용한 Connection Pool 최적화

화해
화해
2021년 3월 11일

두줄요약

Tomcat PoolCleaner 설정으로 Idle·장기 실행 Connection을 관리하는 방식을 정리했습니다. ClassLoader 문제로 Timer가 중지되는 원인과 해결책을 공유했습니다.

문제 상황

  • Tomcat DBCP의 Idle·장기 Active Connection 관리와 DBMS wait timeout 대응 필요
  • PoolCleanTimer 중지 후 webapp reload 시 Timer already cancelled 및 IllegalStateException 발생

구조와 흐름

  • removeAbandoned와 removeAbandonedTimeout 기반의 장기 실행 Connection 정리
  • minIdle, testWhileIdle, validationQuery로 Idle Connection 유지 및 유효성 검사
  • timeBetweenEvictionRunsMillis에 따른 싱글 스레드 PoolCleaner 스케줄 실행

원인 분석

  • PoolCleanTimer 중지 후 재시작 불가로 Idle Connection 검사와 wait timeout 초기화 중단
  • JDBC Driver를 WEB-INF/lib에 둘 때 webapp별 ClassLoader 분리와 기존 ConnectionPool 미종료 문제

해결 방법

  • JDBC Driver를 tomcat/lib로 이동해 CommonClassLoader 기반으로 관리
  • GlobalNamingResource로 ConnectionPool 공유 또는 Resource의 closeMethod로 종료 시 정리
  • 실행 중 쿼리 중단 방지를 위한 충분한 removeAbandonedTimeout 설정

다음 읽기

비슷한 주제의 백엔드 글

99%가 모른다는 DB Connection 누수 문제

JDBC Driver 변경 이후 발생한 OOM 원인을 DB Connection 누수로 추적하고 Heap Dump로 확인했습니다. mysql-connector-j 업그레이드와 cleanup thread 비활성화로 문제를 해결했습니다.

마켓컬리
마켓컬리
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...