본문으로 건너뛰기
버전: 5.1.0-11.0

H8. DB 커넥션 풀 고갈 진단

Diátaxis: How-to(목표별 가이드) · 대상: 운영자 / 관리자 ← 목차로

"DB는 멀쩡한데 애플리케이션만 느리거나 멈춘다", "특정 시간대에만 요청이 줄줄이 대기한다"면 커넥션 풀 고갈을 의심합니다. 풀에 빌려줄 연결이 없으면, 뒤따르는 요청은 연결을 얻을 때까지 대기하다 타임아웃됩니다. 이 문서는 WAS의 데이터소스 탭으로 이를 진단하는 순서입니다.

커넥션 풀이 무엇인지, 그룹·인스턴스 개념은 E2. 핵심 개념을, 차트 임계치는 R2.1 WAS 차트 — 데이터소스를 보세요.

여는 법 — 좌측 메뉴 ▸ WAS ▸ (인스턴스 선택) ▸ 데이터소스


데이터소스 풀 활성/대기 확인

데이터소스 Pool 차트(활성 DB 커넥션 탭)에서 **사용 중인 연결 수(Active)**가 **최대 풀 크기(Max)**에 얼마나 가까운지 봅니다.

모습해석
Active가 Max보다 충분히 낮음정상 — 여유 있음
Active가 Max에 자주 닿음(상한에 머무름)주의 — 풀에 여유가 없음. 대기가 생기기 직전
Active가 Max에 붙은 채 평탄위험 — 고갈. 새 요청은 연결을 못 받고 대기 중
데이터소스 풀 — egovDS_leak 한 데이터소스만 Max(10)까지 차올라 붙은 채 평탄(고갈), 나머지(egovDS·egovDS_small)는 낮게 안정

위 화면은 한 인스턴스에 데이터소스가 셋(egovDS · egovDS_leak · egovDS_small)일 때입니다. egovDS_leak 만 계단처럼 차올라 Max(10)에 붙은 채 평탄 — 고갈입니다. 나머지 둘은 낮게 안정적이라, 문제는 그 데이터소스 한 곳에 한정됩니다.

참고 데이터소스가 여러 개면 어느 데이터소스인지부터 가립니다. 한 DB만 상한에 머물러 있다면 그 DB로 가는 쿼리가 느리거나, 그 경로의 연결이 반환되지 않는 것입니다.

주의 "Active가 Max에 붙음"은 두 가지 원인이 있습니다 — ① 쿼리가 느려 연결을 오래 잡고 있음, ② 연결을 반환하지 않음(누수). 다음 두 절에서 어느 쪽인지 가립니다.


커넥션 누수 이벤트 점검

연결을 빌리고 반환하지 않으면(코드의 close() 누락 등) 풀이 서서히 말라갑니다. 누수는 "고갈된 채로 회복되지 않는다"는 점에서 일시적 과부하와 다릅니다.

  • 판별법 — 트래픽이 줄어든 뒤에도 Active가 내려오지 않으면 누수 쪽입니다.
  • R3. 이벤트 종류 레퍼런스에서 데이터소스 관련 이벤트(임계 초과 등)가 쌓였는지 확인합니다.
  • 인스턴스를 재시작하면 잠시 풀리지만, 누수 코드가 그대로면 같은 시간 뒤 재발합니다.

트랜잭션 상세의 Connection 대기 패턴

"연결을 못 받아 대기"가 실제로 일어나는지는 트랜잭션 하나를 열어 확인하는 것이 가장 확실합니다.

  1. 통계·트랜잭션 분석에서 느린 트랜잭션을 하나 엽니다.
  2. 워터폴(처리 구간)에서 **DB 작업이 시작되기 전 빈 구간(대기)**이 길게 있는지 봅니다 — 쿼리 실행이 아니라 연결 획득 대기라면 풀 고갈 신호입니다.
  3. 반대로 빈 구간 없이 쿼리 실행 자체가 느리다면 풀이 아니라 쿼리 문제이므로 H6. 느린 트랜잭션 원인 찾기로 넘어갑니다.
호출 흐름 — ConnectionPool.getConnection() 한 줄이 전체 시간(3.02초)을 차지: 쿼리가 아니라 연결 획득 대기

위 예시는 ConnectionPool.getConnection() 막대가 트랜잭션 전체 시간을 차지합니다 — SQL이 느린 게 아니라 연결을 빌리는 데 시간을 다 쓴 것으로, 풀 고갈의 결정적 증거입니다.

트랜잭션 상세를 읽는 법은 T2. 느린 요청 하나, 끝까지 추적해보기에 단계별로 있습니다.


조치

확인된 상황1차 조치
쿼리가 느려 연결을 오래 점유해당 SQL 튜닝·인덱스 점검 (H6) — 근본 원인
연결 미반환(누수)close() 누락 코드 점검(개발팀 전달). DataSource 누수 감지 설정 활성화 검토
정상인데 트래픽 대비 풀이 작음최대 풀 크기 상향(단, DB의 max_connections와 함께 검토)
급한 불트래픽 분산 후 인스턴스 순차 재시작으로 우선 회복

주의 풀 크기만 무작정 키우면 DB쪽 연결 한도(max_connections)를 넘겨 DB가 거꾸로 거부할 수 있습니다. WAS 풀 합계가 DB 한도를 넘지 않게 맞춥니다.


잘 안될 때

증상점검
데이터소스 탭이 비어 있음인스턴스 연결 상태 — H20. 에이전트 점검
풀은 여유 있는데 DB가 느림풀 문제 아님 — DBMS 대시보드/진단 확인 (R2.3 DBMS 차트)
연결 대기·쿼리 지연 구분이 안 됨트랜잭션 상세 워터폴로 구간 분리 (T2)

관련 문서