프로그래밍/Spring boot

DB Connection Pool(DBCP) 개념

파란막대 2022. 7. 2. 15:50

※ 스프링 공부중 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.