JDBC Connection Pooling


개요

JDBC Connection을 얻기 위한 키워드로 DBCP, DataSource에 대해 알아본다.


Connection Pool

DB Connection을 얻고 쿼리를 실행하는 절차는 아래와 같다.

  1. database driver를 이용하여 connection 획득
  2. data 송/수신을 위해 TCP Socket 연결 획득
  3. 획득한 socket 연결을 이용해서 데이터 송/수신
  4. connection 해제(close)
  5. socket 해제(close)

이와 같이 하나의 트랜잭션 수행을 위한 비용이 상당히 비싸다.

이러한 비용 문제를 해결하기 위해 등장한 것이 Connection Pool인데 말 그대로 connection을 풀장에 적당한 수 만큼 저장하는 개념이다.

트랜잭션 수행 마다 connection 획득, 해제 등의 절차 없이 단순히 Connection Pool에 미리 획득해둔 연결을 가져다 사용하고 사용 후 반납하기 때문에 연결/해제의 리소스가 상당히 절감된다.

이러한 Connection Pool을 제공받기 위해서 보통 DBCP, DataSource를 사용하는데 DataSource의 경우 구현체 별로 Connection Pool를 제공하는 경우도 있고 제공하지 않는 경우도 있다.

보통 Spring과 같은 Container에서 제공하는 DataSource의 경우는 대부분 제공한다.


DataSource

보통 DataSourceJNDI naming service에 등록되어 사용되는데, 한 번 등록이 완료가 되면 어플리케이션은 JNDI로 부터 lookup하여 DataSource를 가져와 사용한다.

만일 DataSourceconnection pool을 제공한다면 pool에서 connection을 반환하고 connection pool을 제공하지 않는다면 새로 Connection 객체를 생성 및 획득해서 제공한다.


DataSource로 부터 얻은 connection은 일반 Connection 객체와 동일한 타입인 것 처럼 보이지만 실제로는 Connection의 프록시 객체로써, close() 호출 시 실제로 연결 해제를 하는 것이 아니라 connection pool에 반환하는 것이 일반적이다.


참고