DB 커넥션풀
DB 커넥션 객체를 여러 개 생성하여 풀(Pool)에 담아 놓고 필요할 때 꺼내 쓰는 방식
풀링(Pooling)
자주 쓰는 객체를 미리 만들어 두고, 필요할 때마다 빌리고 사용한 다음 반납하는 방식
여러 개의 객체를 모아둔 것을 "객체 풀(object pool)", 여러 개의 DB 커넥션 객체를 관리하는 것을 "DB 커넥션풀"
DB 커넥션풀이 필요한 이유
"Statement는 롤백이 안 된다!"
다음은 싱글 커넥션 사용의 문제점이다.
위의 그림에서 DAO 1, 2, 3이 사용하는 Statement는 같은 커넥션에서 생성한 객체
SQL문을 실행하다 보면 DAO3처럼 예외에 발생했을 때 이전 상태로 되돌려야 하는 경우가 있다.
이렇게 작업하기 전 상태로 되돌리는 것을 "롤백(RollBack)"이라고 하는데, Statement객체에는 롤백 기능이 없다.
커넥션 객체를 통해서만 롤백이 가능하다. 그래서 DAO3이 롤백하면 문제 없이 수행된 DAO1, 2 역시 롤백 된다.
따라서 각기 다른 커넥션 객체를 사용해야 원활히 롤백을 사용할 수가 있다.
그렇기에 각 요청에 대해 개별 DB 커넥션을 사용해야 한다.
이를 해결하겠다고 SQL작업을 할 때마다 DB 커넥션 객체를 생성해야 되나?
실행 속도가 느려지고 많은 가비지(Garbage)가 발생하게 될 것이다. 속도가 느려지는 이유는 커넥션을 맺을 때마다 데이터베이스 서버는 사용자 인증과 권한 검사를 수행하고 요청 처리를 위한 준비 작업을 해야 하기 때문이다.
그래서 DB 커넥션풀을 사용해야 한다.
DB 커넥션풀은
1) 각 요청에 대해 별도의 커넥션 객체를 사용하기 때문에 다른 작업에 영향을 주지 않는다.
2) 사용한 DB 커넥션 객체는 버리지 않고 풀에 보관해 두었다가 다시 사용하기 때문에, 가비지가 생성되지 않고 속도도 빨라진다.
'ServletJDBC' 카테고리의 다른 글
의존 객체 관리 (0) | 2015.08.05 |
---|---|
프런트 컨트롤러(Front Controller) (0) | 2015.08.05 |
DI 와 IoC (0) | 2015.07.20 |
DAO - Data Access Object (0) | 2015.07.20 |
서블릿 데이터 보관소 (0) | 2015.07.20 |