최초 Pool 내에서 연결(Connection)들을 하여 HTTP 요청에 따라 응답을 제공하고 반환받으며 이를 재사용하는 것
사용자로부터 웹 애플리케이션에 요청이 들어올 때마다 데이터베이스 연결을 수립하고 해제하는 것은 매우 비효율적이다.
→ 이를 해결하기 위해 등장한 것이 바로 DBCP!
미리 여러 개의 데이터베이스 커넥션을 생성하여 연결해두고, 필요할 때마다 꺼내서 쓰는 방식으로, 매번 DB 요청이 들어올 때마다 새롭게 연결을 하는 것이 아닌 항상 연결을 열린 상태로 유지한다.
여기서 커넥션 풀에 있는 커넥션들은 이미 TCP/IP로 DB와 연결되어 있는 상태를 유지하므로, 언제든지 즉시 SQL을 DB에 전달할 수 있는 것이다.
이는 애플리케이션을 시작하는 시점에 필요한 만큼 미리 확보하여 풀에 보관을 하는데, 이때 크기를 지정해줄 수 있다. (기본값은 10개!)
데이터베이스는 웹 애플리케이션과 분리되어 있기 때문에, 데이터베이스 드라이버를 이용하여 따로 연결해주는 작업이 필요하다.
→ 이것이 바로 데이터베이스 연결의 lifecycle 이다.
WAS와 데이터베이스와의 연결(Connection)을 줄임으로써 비용 절감
Pool 내에 미리 연결되어 있기 때문에 매번 생성하지 않아도 OK
Connection에 대한 조정 가능 인프라의 DB Connection 수도 함께 고려해야 함
*Connection Pool의 크기 설정
데이터베이스 커넥션 풀 프레임워크에는 대표적으로 Apache Commons DBCP, Tomcat DBCP, HikariCP, Oracle UCP 등이 있다.
그중에서도 HikariCP는 스프링부트에 기본으로 내장되어 있는 JDBC 데이터베이스 커넥션 풀링 프레임워크이다. 가장 우선적으로 HikariCP를 사용하고, 이를 사용할 수 없는 상황에서는 Tomcat DBCP → Apache Commons DBCP → Oracle UCP 순으로 선택한다고 한다.
스프링부트 서버를 처음 실행할 때 아래와 같은 로그를 볼 수 있다.
이는 서버의 실행과 동시에 HikariCP가 시작되고 있다는 의미이다.
HikariCP를 사용하는 이유는! 바로 벤치마크의 결과 가장 성능이 좋은 것으로 나타났기 때문!
HikariCP는 바이트코드 수준까지 극단적으로 최적화되어 있다고 한다. 또한, Java의 컬렉션 프레임워크 사용에서 최적화가 잘 되어 있어 위와 같이 좋은 성능을 띄는 것으로 보인다.
logging:
level:
com.zaxxer.hikari.pool.HikariPool: debug
Artifacts
Java 11+ maven artifact:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.0</version>
</dependency>
Java 8 maven artifact (maintenance mode):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
Java 7 maven artifact (maintenance mode):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java7</artifactId>
<version>2.4.13</version>
</dependency>
Java 6 maven artifact (maintenance mode):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.13</version>
</dependency>