DBCP가 없을 때의 문제점

TCP는 연결지향 속성이 있음.
Open connection은 3-way handshake.
Close connection은 4-way handshake.
매번 connection을 열고 닫는 시간적인 비용 발생
서비스 성능에도 좋지 않다.
DBCP는 무엇인가?

연결은 유지한채 커넥션 풀로 반납. (기존 방식과 다름)
DBCP 설정방법
서버 관점


커넥션풀은 HikariCP, DB는 MySQL 대상으로 설명.
max_connections
- client와 맺을 수 있는 최대 connection 수
- max_connections은 서버가 몇개로 늘어난다고 해도 설정값을 넘을 수 없다.
wait_timeout
- connection이 inactive할 때 다시 요청이 오기까지
- 얼마의 시간을 기다린 뒤 close할 것인지를 결정
- 시간 내에 요청이 도착하면 0으로 초기화

백엔드 어플리케이션 관점
minimum_idle
- pool에서 유지하는 최소한의 idle connection 수
- idle connection 수가 minimum_idle보다 작고, 전체 connection 수가 maximumPoolSize보다 작다면 신속하게 추가로 connection을 만든다.
- 기본 값은 maximumPoolSize와 동일 (=pool size 고정) *HikariCP 권장사항
maximumPoolSize
- pool이 가질 수 있는 최대 connection 수
- idle과 active(in-use) connection을 합치면 최대 수를 가짐
maxLifetime
- pool에서 connection의 최대 수명
- maxLifetime을 넘기면 idle일 경우 pool에서 바로 제거, active인 경우 pool로 반환된 후 제거
- pool로 반환되지 않으면 maxLifetime이 동작하지 않음
(사용한 커넥션은 pool로 잘 반환시켜주는 것이 중요)
- DB의 connection time limit보다 몇 초 짧게 설정해야 한다.

connectionTimeout
- pool에서 connection을 받기 위한 대기 시간

적절한 connection 수를 찾기 위한 과정

서버 부하를 분산시키기 위해 read-only와 read-write를 구분한다.




- maximumPoolSize와 max_connection 값을 서로 조율하며 하드웨어 성능을 최대한으로 끌어내기
maxiumPoolSize을 몇대의 백엔드 서버에 분할할 것인지 max_connection을 계속 늘렸을 때 서버의 부하가 줄어들 것인지 종합적으로 고려하면서 connection 수를 설정할 수 있다.
예시) 25+25=50가 괜찮다면 25+25=100으로 100으로 최대 연결을 풀고. 25+25+25+25=100으로 할 것인지 아니면 50+50=100으로 해도 서버가 버틸 수 있을 것인지 40+40 < 100으로 여유를 둘 것인지 등등



네이버 D2 - Commons DBCP (https://d2.naver.com/helloworld/5102792)