Java와 DB를 연동하던 도중, Connection Pool 이란 것을 배웠다.
이게 뭘까...?
보통 DB Connection Pool 줄여서 DBCP라고 부른다.
지금부터 DBCP 혹은 커넥션 풀이라고 부르겠다.
DB Connection Pool (DBCP)
어플리케이션이 실행되면서DB와 미리 Connection객체들을 생성 후,
DB를 접근해야할때 미리 생성했던Connection 객체들을 사용하는 방식
Connection 객체 과정
출처: 요기
일단 왜 사용하는지 전에,
일반적인 Connection 객체는 어떠한 과정으로 연결되는지 알아야 할 필요가 있다.
Connection 조회Connection 연결Connection이 연결되면 ID,PW 등 기타 부가정보를 DB에 전달Connection 생성이 완료되었다는 응답을 보냄Connection 객체를 생성해서 반환위의 과정을 보면 알겠지만,
자바에서는 DB에 직접 연결을 처리하는 경우(JDBC 사용), Driver를 로드하고 Connection객체를 받아와야 한다.
그럼 한 작업을 수행한다고 가정하면, Driver를 로드하고, 객체 생성하고 작업 끝나면 종료하고...
너무 자원을 낭비하는 과정이다.
그래서 커넥션 풀(DBCP)을 통해 이미 연결하는 작업을 pool에 있기 때문에 그것을 재사용하는 것이다.

출처: https://velog.io/@parksegun/DB-Connection-Pool
1. App이 시작하는 시점에 커넥션 풀(DBCP)은 필요한 만큼의 Connection을 보관
2. Connection이 생성되어 있기에, TCP/IP로 DB와 연결되어 있는 상태, 즉시 DB에 접근 가능
3. Connection을 사용한 후에는 커넥션 풀(DBCP)에 반납
Java에서는 이런 문제를 해결하기 위해 javax.sql.DataSource라는 Interface를 제공한다.
Spring Boot 2.0 이전에는 Apache Commons DBCP를 주로 사용
하지만 2.0 이후로는 HikariCP를 기본 DBCP로 채택
# application.yml
spring:
datasource:
hikari:
maximum-pool-size=4
이런식으로 사용하면 된다.
너무 많은 Connection을 생성하면 메모리를 많이 잡아먹게 되고,
너무 적은 Connection을 생성하게 될 경우, 접속자 수가 증가하게 되면 대기 시간이 증가하게 된다...
뭐... 물론 실제 운영할 환경에서 테스트를 진행하면서 맞추는게 제일 베스트이긴 한데..
일단 WAS의 Thread의 개수 > Connection Pool 이다.
서버에 대한 모든 Request가 DB에 접근하는 것이 아니니까, Thread의 개수를 쪼금 더 여유롭게 설정하는 편인 것 같다.