SpringBoot는 사용이 보편화됨에 따라 Embedded Tomcat을 사용하고 있습니다. 따라서 Application 레벨에서 Datasource 관련 설정을 모두 할 수 있습니다. Hikari CP는 SpringBoot 2.0부터 기본 JDBC connection pool 의존성으로 도입되었습니다. 또한 HikariCP는 다른 DBCP보다 성능이 높다고 알려져있습니다.

https://github.com/brettwooldridge/HikariCP

HikariCP 설정

application.yml

spring:
    datasource:
        hikari:
            connectionTimeout : 30000
            maximumPoolSize : 10
            maxLifetime : 1800000
            poolName : HikariCP
            readOnly : false
            connectionTestQuery : SELECT 1

connectionTimeout (default : 30000 (30초))

클라이언트가 Connection Pool에 connection을 요청하는데 기다리는 최대시간을 설정합니다. 설정한 시간을 초과하면 SQLException이 발생합니다. (허용 가능한 최소 연결 시간은 250ms)

maximunPoolSize (default : 10)

idle 및 사용중인 connection을 포함하여 풀에 보관 가능한 최대 커넥션 개수를 설정합니다. 사용할 수 있는 커넥션이 없다면 connectionTimeout 시간 만큼 대기하고 시간을 초과하면 SQLException이 발생합니다.

minimumIdle (default : maximumPoolSize 값)

connection pool에서 유지가능한 최소 커넥션 개수를 설정합니다.
최적의 성능과 응답성을 원하면 이 값을 설정하지 않는게 좋다고 합니다.

idleTimeout (default : 600000 (10분))

connection pool에서 Idle 상태로 유지시킬 최대 시간을 설정합니다. 이 설정은 minimumIdle이 maximumPoolSize보다 작은 경우에만 사용할 수 있습니다. pool에 있는 connection이 minimumIdle 시간에 도달할 경우 이후에 반환되는 connection에 대해서 바로 반환하지 않고 idleTimeout 만큼 Idle 상태로 있다가 폐기됩니다.

maxLifeTime (default : 1800000 (30분))

connection의 최대 유지 시간을 설정합니다. connection의 maxLifeTime 지났을 때, 사용중인 connection은 바로 폐기되지않고 작업이 완료되면 폐기됩니다. 하지만 Idle 커넥션은 바로 폐기됩니다.

readOnly (default : false)

pool에서 얻은 connection이 기본적으로 readOnly인지 지정하는 설정입니다. 데이터베이스가 readOnly 속성을 지원할 경우에만 사용합니다.

connectionTestQuery (default : none)

데이터베이스 연결이 여전히 활성화되어있는지 확인하기 위해 pool에서 connection을 제공하기 전에 실행되는 쿼리입니다. 드라이버가 JDBC4를 지원하는 경우 이 속성을 사용하지 않는 것이 좋습니다.

 

Connection Pool 확인 

Connection Pool에 대한 로그는 DEBUG 레벨로 남습니다. 아래와 같이 설정 후 애플리케이션을 실행합니다.

logging:
  level:
    com.zaxxer.hikari.pool.HikariPool: debug

실제 데이터 베이스에서는 아래와 같은 쿼리로 조회할 수 있습니다.

-- MySQL
SHOW STATUS LIKE 'Threads_connected';

-- PostgreSQL
SELECT * FROM pg_stat_activity;
SELECT count(*) FROM pg_stat_activity 
  WHERE application_name LIKE '%JDBC%';

실제 로컬에서 확인해본 결과 Connection이 31개인 것으로 확인되었습니다. 1의 오차는 DataGrip으로 쿼리를 날리게되어 Connection이 한개 더 나오게 되었습니다.