Tomcat JDBC Pool에서 커넥션 누수(abandoned) 잡아내는 방법
조회 2 · 댓글 0
커넥션 풀이 꽉 차서 Pool empty. Unable to fetch a connection이 뜨는데 실제 DB 부하는 낮다면, 애플리케이션이 close()를 빼먹어 커넥션을 반납하지 않는 누수를 의심해 봅니다. Tomcat JDBC Pool(org.apache.tomcat.jdbc.pool.DataSourceFactory)에는 이걸 잡는 abandoned 감지 옵션이 기본으로 들어 있습니다. 기본값은 모두 꺼져 있어 직접 켜야 합니다.
removeAbandoned="true"를 켜면 removeAbandonedTimeout(기본 60초)보다 오래 빌려간 커넥션을 강제로 회수합니다. 여기에 logAbandoned="true"(기본 false)를 같이 주면 커넥션을 빌려간 코드의 스택 트레이스를 로그로 남겨 범인 위치를 바로 찾습니다.
<Resource name="jdbc/sarc" auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
type="javax.sql.DataSource"
maxActive="50" maxIdle="10"
removeAbandoned="true"
removeAbandonedTimeout="120"
logAbandoned="true"
suspectTimeout="60" />주의할 점은 removeAbandoned는 사용 중인 커넥션을 실제로 닫는다는 겁니다. 정상적으로 오래 걸리는 배치나 리포트 쿼리가 있으면 removeAbandonedTimeout을 가장 긴 쿼리보다 크게 잡아야 멀쩡한 작업이 끊기지 않습니다. 운영 반영 전이라면 커넥션을 닫지 않고 경고만 남기는 suspectTimeout(기본 0, 초 단위, 0보다 커야 동작)으로 먼저 로그를 확인해 보는 편이 안전합니다.
로그인 후 답글을 남길 수 있습니다.