쉬운코드 님의 DBCP (DB connection pool)의 개념부터 설정 방법까지! hikariCP와 MySQL을 예제로 설명합니다을 보고 정리한 글 입니다.
편의상 백엔드 애플리케이션 단은 BE로, 앞으로 설명할 Database Connection Pool은 DBCP로 부르겠습니다.
BE와 DB 통신은 TCP 연결 기반으로, connection open 시에 3-way handshaking, close 시에 4-way handshaking을 한다. 즉, 커넥션을 연결하거나 끊는 과정이 가장 비용이 크다.
매 요청마다 커넥션을 열고 닫는 비용을 덜기 위해 나온 게 Database Connection pool이다. (= DBCP)
미리 커넥션 연결을 지어 놓은 객체들이 모여 있는 곳이다.
직접 connection을 열고 닫는 게 아닌, pool에서 빌리고 다 쓴 뒤 반환하는 방식이다.
MySQL(DB) / HikariCP(DBCP) 기준
1) DB 입장에서 설정하는 DB 서버 설정과,
2) BE 입장에서 설정하는 DBCP 설정으로 나뉜다
client와 맺을 수 있는 최대 connection 수
max_connections를 충분히 늘리면 서버를 늘려도 수용 가능 (BE단의 maximumPoolSize 고려 필요)
client와의 연결을 끊기까지 임계치
DB의 입장에서 적절한 시점에 connection을 닫을 필요가 있다.
BE단에서 비정상 종료/네트워크문제 등으로 인해 반환을 못할 수도 있기 때문.
그러면 DB단에서는 열려 있다고 간주하고 하염없이 기다릴 수도 있다. 이런 상황을 방지하기 위해 필요하다.
idle connection의 최소 임계치 (default는 10으로, maximumPoolSize와 같다 -> 권장 !)
pool이 가질 수 있는 최대 커넥션 수 (idle + active)
1) 현재 idle connection <= minimumIdle
2) 전체 connection 수 <= maximumPoolSize
이 경우에 추가로 connection을 만들 수 있다.
즉, 상황에 따라 유동적으로 커넥션 추가/삭제 가능
minimumIdle = 2, maximumPoolSize = 4인 경우
active connection = 1, idle connection = 1라면 ?
1, 2의 조건을 만족하므로 connection++
active connection = 2, idle connection = 1라면 ?
1, 2의 조건을 만족하므로 connection++
active connection = 3, idle connection = 1라면 ?
1은 만족하지만 2는 만족하지 않으므로 더 이상 늘리지 않는다.
디폴트는 minimumIdle = 10, maximumPoolSize = 10로 설정되어 있다고 한다 👉 고정 pool size 권장
pool에서 connection의 최대 수명
client가 pool에서 connection을 받기 위한 대기 시간의 임계치. 사용자가 무한정 기다리는 상황을 방지하기 위함.
다른 파라메터값 설명은 Hikari Github을 참고해주세요 !