본문 바로가기
Apache Tomcat

Tomcat(톰캣)의 Abandoned Connection 구조하기 (removeAbandoned)

aappsroot·2015년 4월 25일·조회 9,324

1. 사전 지식

우선 Tomcat의 DataSource (JDBC Connection Pool)에 대한 전반적인 이해가 필요합니다.


2. 개요

이 기능을 사용하려면 Tomcat JDBC Connection Pool을 사용해야 합니다. 즉, 리소스 설정의 factoryorg.apache.tomcat.jdbc.pool.DataSourceFactory여야 합니다. DBCP를 사용하는 경우에는 설정 항목이나 동작 방식이 다를 수 있습니다.

아래와 같은 로그는 커넥션 풀에서 빌려 간 커넥션이 정상적으로 반환되지 않았거나, 설정된 시간 이상 반환되지 않은 상태로 남아 있을 때 발생할 수 있습니다. 특히 removeAbandoned, removeAbandonedTimeout, logAbandoned 같은 설정을 함께 사용할 때 원인 추적에 도움이 됩니다.

4월 24, 2015 1:59:01 오후 org.apache.tomcat.jdbc.pool.ConnectionPool abandon
경고: Connection has been abandoned PooledConnection[org.mariadb.jdbc.MySQLConnection@27835149]:java.lang.Exception
        at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1063)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:780)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:619)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)

확인할 점

  • 애플리케이션 코드에서 Connection, Statement, ResultSet을 사용한 뒤 반드시 닫고 있는지 확인합니다. 가능하면 try-with-resources를 사용하는 것이 안전합니다.
  • 트랜잭션 처리 중 예외가 발생했을 때도 커넥션이 반환되는지 확인합니다. 예외 경로에서 close()가 누락되면 같은 문제가 반복될 수 있습니다.
  • 로그에 출력된 스택 트레이스는 커넥션을 빌린 위치를 추적하는 단서입니다. 실제 누수 지점은 로그가 찍힌 시점이 아니라, 해당 커넥션을 가져간 코드 경로일 수 있습니다.

간단한 테스트는 의도적으로 커넥션을 닫지 않는 코드를 실행한 뒤, 설정한 시간 이후 위와 같은 abandoned connection 로그가 남는지 확인하는 방식으로 할 수 있습니다. 다만 운영 환경에서는 커넥션 누수를 재현하기보다, 로그를 통해 의심 지점을 찾고 해당 코드에서 자원 해제가 보장되는지 점검하는 것이 좋습니다.

관련 글

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.