매뉴얼웍스에서 java.sql.Connection 누수 추적하기

java.sql.Connection 누수의 문제점

java.sql.Connection 객체를 닫지 않아 누수(leak) 되면, 다음과 같은 심각한 문제가 발생할 수 있습니다:

커넥션 풀 고갈(Connection Pool Exhaustion)

커넥션이 닫히지 않고 계속 점유되면, 더 이상 커넥션을 생성할 수 없기 때문에 다음 getConnection()에서 대기하거나 타임아웃 또는 에러가 발생합니다.

시스템 자원 고갈

커넥션은 데이터베이스 서버와 실제 네트워크 소켓 + 트랜잭션 상태를 유지합니다. 계속 열려 있으면 데이터베이스 서버의 리소스(메모리, 커서, 세션 등)도 고갈되어 성능 저하, 비정상 종료, DB 서버 과부하로 이어질 수 있습니다.

트랜잭션 미종료 문제

누수된 커넥션이 AutoCommit=false 또는 수동 트랜잭션 상태였다면 트랜잭션이 열린 채로 유지되며, 해당 레코드에 락이 걸릴 수 있습니다. 결과적으로 다른 쿼리가 대기하거나 데드락(deadlock) 이 발생합니다.

예외 은닉 및 디버깅 어려움

커넥션을 닫지 않으면 해당 호출 스택을 잃어 버려, 어디서 문제가 발생했는지 추적하기 어렵습니다. 특히 스레드 풀, 배치 등에서 누수되면 증상이 간헐적으로 발생해 디버깅 매우 어렵습니다.

java.sql.Connection 누수 추적하기

쓰리래빗츠는 매뉴얼웍스를 개발하면서 이 문제가 발생하지 않도록 최선을 다하고 있습니다. 그럼에도 불구하고 문제가 발생하면 다음 방법으로 java.sql.Connection 누수를 추적 합니다.

매뉴얼웍스 자체 추적 기능을 사용하려면 매뉴얼웍스 6.0 빌드 번호가 0316 이상이어야 합니다.

  1. 시작 스크립트 옵션 설정을 참고해서 3rabbitz.wrap_sql_contrue로 설정합니다.

  2. 매뉴얼웍스를 다시 시작합니다.

다음 URL을 통해 누수된 java.sql.Connection을 확인합니다.

http://127.0.0.1:1975/r/sql_monitor/monitor

사용하는 매뉴얼웍스로 주소를 변경하여 호출합니다.

누수가 발생한 위치를 추적하기 위해서 스택 트레이스(Stack Trace)를 매번 추출합니다. 따라서 시스템 성능에 영향을 미칠 수 있습니다. 운영 환경에서는 신중하게 사용하고, 문제가 해결되면 원래 설정으로 되돌리는 것을 권장합니다.