자바에서 DB에 직접 연결해서 처리하는 경우(JDBC) 드라이버(Driver)를 로드하고 커넥션(connection) 객체를 받아와야 합니다.
매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적입니다.
웹 컨테이너(WAS)가 실행되면서 connection 객체를 미리 pool에 생성해 둡니다.
HTTP 요청에 따라 pool에서 connection객체를 가져다 쓰고 반환합니다.
이와 같은 방식으로 물리적인 데이터베이스 connection(연결)부하를 줄이고 연결 관리합니다.
pool에 미리 connection이 생성되어 있기 때문에 connection을 생성하는 데 드는 요정 마다 연결 시간이 소비되지 않는다.
커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정합니다.
위에 커넥션 풀 설명에 따르면, 동시 접속 할 경우 pool에서 미리 생성 된 connection을 제공하고 없을 경우는 사용자는 connection이 반환될 때까지 번호순대로 대기상태로 기다린다.
여기서 WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간이 줄어들고, 반대로 커넥션 풀을 적게 설정하면 그 만큼 대기시간이 길어진다.
8개의 커넥션을 최대로 활용할 수 있는 상태
4개는 사용 중이고 4개는 대기 중인 상태
커넥션 개수와 관련된 속성은 다음과 같은 조건을 논리적 오류가 없게 설정하는걸 추천합니다.
- maxActive >= initialSize
- maxIdle >= minIdle
- maxActive = maxIdle
DataSource는 java.sql 패키지의 기능을 보조하기 위한 javax.sql 패키지에 들어있다.
DataSource는 java.sql 패키지의 DriverManager를 통해 DB 커넥션을 얻는 것에 비해 다음과 같은 장점을 가지고 있다.
- 서버에서 관리하기 때문에 데이터베이스나 JDBC 드라이버가 변경되더라도 애플리케이션을 바꿀 필요가 없습니다.
- 자체적으로 커넥션풀 기능을 구현하기 때문에 웹 애플리케이션 쪽에서 따로 작업할 것이 없습니다.
- Connection과 Statement 객체를 풀링할 수 있습니다.
- 분산 트랜잭션을 다룰 수 있습니다.