TIL

Connection Pool

Connection이란

데이터베이스 커넥션이란 동일한 시스템에 있든 없든 데이터베이스 서버가 소프트웨어와 통신할 수 있도록 하는 컴퓨터 과학의 기능이다. 커넥션은 명령을 전달하고 대답을 수신할 수 있어야 한다. 출처: https://en.wikipedia.org/wiki/Database_connection

JDBC Connection

Connection Pool

커넥션 풀은 잘 알려진 데이터 엑세스 패턴으로 데이터베이스 커넥션 성능 오버헤드를 줄이기 위한 목적으로 사용된다.

Datasource

Supported Connection Pools

Spring Boot uses the following algorithm for choosing a specific implementation:

  1. We prefer HikariCP for its performance and concurrency. If HikariCP is available, we always choose it.
  2. Otherwise, if the Tomcat pooling DataSource is available, we use it.
  3. Otherwise, if Commons DBCP2 is available, we use it.
  4. If none of HikariCP, Tomcat, and DBCP2 are available and if Oracle UCP is available, we use it

HikariCP

HikariCP는 Brett Wooldridge가 개발한 매우 가볍고 빠른 JDBC 커넥션 풀 프레임워크다.

HikariCP는 내부에서 ConcurrentBag이라는 구조체로 Connection을 관리하는데 HikariPool.getConnection()ConcurrentBag.borrow()라는 메서드로 유휴 Connection을 리턴한다.

default maximumPoolSize = 10

HikariCP 동작 원리

  1. Thread-1이 Connection을 요청
  2. Thread-1이 이전에 사용했던 Connection이 있는지 확인
  3. 존재한다면 리턴하고 없다면 다른 Connection을 Hikari pool 전체에서 찾음
  4. 존재한다면 리턴하고 없다면 handoffQueue에서 사용 가능한 Connection을 찾음
  5. 있다면 리턴, 없다면 기다리는데 30초가 지나면 Timeout이 발생 (HikariCP default Connection timeout = 30초)

JPA와 Connection

  1. 데이터베이스 하나만 사용하는 애플리케이션에서는 EntityManagerFactory를 하나만 생성한다.
  2. 요청이 들어올 때마다 Factory에서 EntityManager를 생성한다. (EntityManager를 생성하는 비용은 거의 안 든다)
  3. 생성된 EntityManager는 바로 Connection을 Connection Pool에서 꺼내오지 않고 필요한 시점 (트랜잭션 시작)에 Connection을 획득한다.

적정 커넥션 풀 크기?

동시 사용자 요청 수에 따라 다르지만 일반적인 공식이 있긴 있다.


참고

https://www.cs.princeton.edu/courses/archive/fall97/cs461/jdkdocs/guide/jdbc/getstart/connection.doc.html

https://www.baeldung.com/java-connection-pooling

https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#jdbc-connections

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#data.sql.datasource.connection-pool

https://www.baeldung.com/hikaricp

https://techblog.woowahan.com/2664/