DBCP란

DBCP(DataBase Connection Pool)란 커넥션을 맺고 있는 객체를 관리하는 역할을 한다.

JDBC의 경우 다음과 같은 순서로 반복한다.

  • DB 접속을 위한 JDBC 드라이버 로드
  • getConnection Method로 DB 커넥션 객체 얻음
  • 쿼리 수행을 위한 PreparedStatement 객체 생성
  • executeQuery를 실행하여 결과를 받아옴

그러나 드라이버 로드와 커넥션 객체를 얻는 것을 반복하는 것은 비효율적이다.

DBCP를 사용시 WAS 실행시 일정량의 DB Connection 객체를 생성하고 Pool 이라는 공간에 저장해 둔다. 그리고 DB 연결 요청이 있으면 이 Pool 이라는 공간에서 커넥션 객체를 가져다 쓰고 반환하게 된다.

고려사항

  • maxActive
    • 커넥션 최대 개수
    • DBMS가 수용할 수 있는 Connection 개수 확인
    • 애플리케이션 서버 인스턴스 1개가 사용하기에 적절한 개수 설정
    • maxActive가 충분히 크지 못할경우 서버에서 많은 요청을 처리하지 못하고 병목현상이 일어난다.
    • maxActive가 불필요하게 크다면 메모리를 많이 점유하게 된다.
    • 실제 운영 환경에서 직접 성능 테스트를 진행하여 최적화된 값을 찾아내는 것이 중요
  • WAS Thread
    • DB Connection Pool 개수보다 크게 설정하는 것이 좋다.
    • 모든 요청이 DB에 접근하는 것은 아니기 때문
    • WAS Thread = Connection Pool + 10 권장사항

오픈소스

  • Commons DBCP
  • Tomcat-JDBC
  • BoneCP
  • HikariCP

커넥션 풀 저장 구조

  • 커넥션 생성은 Commons DBCP에서 이루어진다.
  • Commons DBCP는 PoolableConnection 타입의 커넥션을 생성하고 생성한 커넥션에 ConnectionEventListener를 등록한다.
  • ConnectionEventListener에는 애플리케이션이 사용한 커넥션을 풀로 반환하기 위해 JDBC 드라이버가 호출할 수 있는 콜백 메소드가 있다.
  • 생성된 커넥션은 addObject 메소드로 커넥션 풀에 생성된다.
  • commons-pool은 내부적으로 현재 시간을 담고 있는 타임스탬프와 추가된 커넥션의 레퍼런스를 한쌍으로 하는 ObjectTimestampPair라는 자료구조를 생성한다.
  • LIFO 형태로 CursorableLinkedList를 관리한다.