
JDBC를 사용하여 데이터베이스를 사용하는 경우 다음과 같은 문제점들이 발생할 수 있습니다.
DriverManger.getConnection() 호출 시 연결 또는 인증 과정에 대한 오버헤드 발생 이러한 단점들을 보완하기 위해 Connection Pool을 사용합니다.
Connection Pool은 SQL 실행 요청이 들어올 경우 미리 생성한 Connection을 빌려주고, 실행이 완료된 후 이를 반납하는 방식으로 동작하는 기술을 말합니다. 이로 인해, 기존 JDBC 방식의 문제점인 매번 새로운 Connection을 생성하는 한계를 보완할 수 있어 훨씬 빠르고 효율적으로 SQL을 실행할 수 있습니다.
애플리케이션이 실행될 때 설정값에 따라 미리 일정 개수의 Connection을 생성합니다.

이후, 사용자가 DB에 접근할 때 기존 Connection을 할당받아 DB에 접근하여 필요한 SQL을 수행합니다.

SQL 실행 후 Connection을 닫지 않고 다시 Pool로 반환합니다.

다음에 또 새로운 요청이 들어와도 위 동작을 반복 수행하며 미리 생성한 Connection을 재사용합니다.
Connection Pool을 지원하는 대표적인 라이브러리는 다음과 같습니다.
이들은 다음과 같은 특징을 가지고 있습니다.
HikariCP는 성능이 가장 빠르며, Spring Boot에서 기본으로 사용하는 라이브러리입니다.
다음 예시와 HikariConfig 객체를 통해 데이터베이스 연결 정보와 유지할 커넥션에대한 최대 갯수를 지정한 후, 이를 기반으로 HikariDataSource 객체를 생성하여 사용할 수 있습니다.

또한, Spring Boot의 경우 yml(또는 properties) 파일을 사용하여 다음과 같이 간단하게 설정을 자동으로 주입하여 사용할 수 있습니다.
spring:
datasource:
# 데이터베이스 연결 정보
url: "jdbc:mysql://localhost:3306/test"
username: "root"
password: "1234"
hikari:
# 최대 유지할 커넥션 갯수
maximum-pool-size: 10
Apache DBCP2는 안정성이 높지만, 성능은 HikariCP보다 낮습니다. 과거에는 많이 사용했지만, 현재는 HikariCP를 더 많이 사용합니다.
C3P0는 Hibernate에서 기본 라이브러리로 사용했지만, 현재는 거의 사용되지 않습니다. 또한, 3개의 라이브러리 중 가장 성능이 낮습니다.
일정 갯수의 커넥션을 미리 생성해서 빌려 사용하는 방식