DB Connection Pool(DBCP) 개념
※ 스프링 공부중 Connection Pool에 대한 개념을 정리한 글입니다.
DB Connection Pool에 대한 이해
일반적으로 DB작업을 수행할 때에
DB드라이버 로드 -> DB접속(Connect) -> SQL 실행 -> 접속 해제 (Close)
순으로 코드를 작성한다.
DB접속이 클라이언트에서 이루어지거나, 서버에서 데몬형태로 처리되는 환경에서는 위와 같은 방식의 코딩은 문제가 없으나,
웹 환경과 같이 다중 클라이언트의 요청을 서버에서 처리해야 하는 경우라면 얘기가 다르다.
서비스를 요청할 때마다 드라이버 로드, DB접속, 접속해제를 반복하며, 요청이 많아질 수록 반복되는 자원 할당 및 해제로 인해 성능 저하가 발생할 수 있다.
이러한 문제를 해결하기 위해 DB접속이된 Connection 객체를 미리 만들어 pool에 등록해 두었다가, 서비스 요청이 들어오면 Connection 객체를 꺼내(Active상태) DB작업을 처리한 후, pool 에 다시 반납(idle 상태)하는 방식이 DBCP의 기본 개념이다.
이 Connection Pool 사이즈가 클수록 많은 요청을 빠르게 처리할수 있으나, 자원이 선점되어 낭비가 발생할 수 있고,
Pool사이즈를 줄이면 자원 낭비를 막는대신 요청자가 기다리는 상황이 발생할 수 있다.
DBCP의 종류에는 Apache에서 제공하는 Common DBCP, Tomcat-JDBC, BoneCP, HikariCP 등이 있으며,
Common DBCP의 속성을 살펴보면서 좀 더 이해하고자 한다.
Common DBCP 주요 속성
속성 | 설명 |
initialSize | 최초 getConnection() 호출시 생성되어지는 connection 갯수 (default : 0) |
maxTotal (1.x에서는 maxActive) | 동시 사용기능한 Connection 최대 갯수 |
maxIdle | 항상 풀에 보관해야하는 유휴 Connection 최대 갯수 음수일 경우 제한 없음 |
minIdle |
Pool에 보관할 유휴 Connection 최소 갯수 |
whenExhaustedAction | Connection Pool에 등록된 Connection이 모두 사용중일 때 추가요청에 대해 어떻게 처리되는지 결정 1일 경우 maxWait의 시간만큼 대기 2일 경우 일시적으로 Connection을 생성하여 사용함 |
maxWaitMillis(1.x에서 maxWait) | whenExhaustedAction 속성값이 1일때 대기시간으로 사용됨 (단위 : 1/1000초) 0보다 작을 경우 무한 대기 |
- maxTotal > maxIdle 일 경우
maxTotal 이 5이고 maxIdle 이 3 인 경우, 3개의 커넥션이 사용중인 상황에서, 추가 요청이 들어왔을 때 커넥션이 추가로 만들어지나
사용 후에 반납되어 pool 사용의 효과가 줄어든다.
- maxTotal < maxIdle 일 경우
maxTotal 이 3이고 maxIdle 이 5 인 경우, 동시에 3개까지만 커넥션을 사용되고 모두 반환한다. (maxIdle 3과 다를 바 없다)
따라서 maxTotal = maxIdel 로 설정하는 것이 좋다
■ 참고사이트
https://www.holaxprogramming.com/2013/01/10/devops-how-to-manage-dbcp/
https://d2.naver.com/helloworld/5102792
https://sjh836.tistory.com/148.