Apache Tomcat

Tomcat 의 connection leak 대응

aappsroot·2014년 1월 30일·조회 4,820

DB 연결 및 처리에 사용되는 Connection, Statement, ResultSet 등의 자원을 명시적으로 close하지 않으면 connection 누수(leak)가 발생할 수 있습니다. 누수가 계속되면 어느 순간 사용할 수 있는 connection이 모두 소진되어 애플리케이션에서 더 이상 DB 작업을 수행하지 못하는 상황에 직면할 수 있습니다.

가장 좋은 해결책은 사용한 자원을 반드시 닫는 것입니다. Java에서는 일반적으로 try-with-resources 구문을 사용해 Connection, Statement, ResultSet이 예외 상황에서도 자동으로 정리되도록 작성하는 것이 안전합니다. 다만 운영 중인 애플리케이션에서 누수가 발생했을 때를 대비해, Tomcat의 DBCP에는 누수 connection에 대응하기 위한 속성이 제공됩니다.

Tomcat DBCP의 누수 connection 대응 속성

  • removeAbandoned : Tomcat에 의해 누수된 connection을 강제로 회수할지 여부를 지정하며, 기본값은 false
  • removeAbandonedTimeout : 누수 connection이라고 판단하기 전까지 해당 connection이 사용되지 않은 상태로 유지되는 시간이며, 기본값은 300초
  • logAbandoned : 누수 connection을 회수할 때 로그에 stack trace를 기록할지 여부를 지정하며, 기본값은 false

이 설정들은 누수로 인한 장애를 완화하는 데 도움이 되지만, 근본적인 해결책은 아닙니다. 강제 회수는 실제로 오래 걸리는 정상 쿼리나 트랜잭션에도 영향을 줄 수 있으므로, removeAbandonedTimeout 값은 서비스의 평균 처리 시간과 긴 배치 작업 여부를 고려해 신중하게 정해야 합니다.

확인 방법

누수가 의심된다면 logAbandoned를 활성화하되, Tomcat/DBCP 버전에 따라 removeAbandoned 또는 removeAbandonedOnBorrow/removeAbandonedOnMaintenance 같은 회수 설정과 removeAbandonedTimeout, 그리고 borrow 시점·maintenance 실행·pool pressure 등 실제 회수를 트리거하는 조건이 함께 충족되어야 stack trace가 기록될 수 있음을 확인해야 합니다. 테스트 환경에서는 의도적으로 connection을 close하지 않는 코드를 실행한 뒤, timeout을 초과한 connection이 이러한 회수 조건이 발생했을 때 회수되고 관련 로그가 남는지 확인하는 방식으로 동작을 검증할 수 있습니다.

단, Tomcat 및 DBCP 버전에 따라 속성 이름이나 적용 위치가 다를 수 있으므로 실제 적용 전에는 사용 중인 Tomcat 버전의 공식 문서를 함께 확인하는 것이 좋습니다.

댓글 0

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

아직 댓글이 없습니다.