Connection Pool

커넥션 풀은 연결을 새로 만들지 않고 빌려 쓰게 한다

핵심은 연결을 많이 열어두는 것이 아니라, 정해진 슬롯 안에서 빌림·점유·반환을 관리해 DB 연결 수를 통제하는 것이다.

요청 스레드

DB 작업이 필요할 때 풀에 연결을 요청한다. 빈 슬롯이 없으면 새 소켓을 무한히 만들지 않고 대기한다.

  • request Aidle 슬롯을 빌림
  • request B반환될 때까지 대기
borrowidle -> active
close()active -> idle

풀 내부 슬롯

conn-1idle
conn-2active
conn-3idle
wait queuepending

애플리케이션의 close()는 보통 물리 소켓 종료가 아니라 풀에 반환하라는 신호다.

DB 서버 한계

풀 크기는 DB가 감당할 수 있는 동시 세션 수 안에서 정한다. 앱 인스턴스가 늘면 전체 연결 수도 같이 늘어난다.

  • 풀 크기maximumPoolSize
  • 대기 시간connectionTimeout
  • DB 비용세션 메모리와 스케줄링
상태 의미 나빠지는 신호
Idle 즉시 빌릴 수 있는 연결 항상 0이면 대기 요청이 늘 수 있다
Active 요청이 점유 중인 연결 오래 높으면 느린 쿼리나 긴 트랜잭션을 의심한다
Pending 빌리기를 기다리는 요청 connectionTimeout 위험이 커진다