Database ( DB )/Database

HikariCP 소개

노루아부지 2020. 10. 17. 15:40

HikariCP란?

HikariCP는 Brett Wooldridge 가 2012년 경 개발한 매우 가볍고 빠르고 안정적인 JDBC Connection Pool 입니다.

심지어 HikariCP는"zero-overhead"라고 홍보를 하고 있습니다.

또한 신뢰감을 높이기 위해 아래와 같은 벤치마크 결과도 보여주고 있습니다.

 

- HikariCP는 Spring boot 2.0부터 default JDBC connection pool 입니다.

 

 

https://github.com/brettwooldridge/HikariCP

 

 

HikariCP가 해주는 역할을 간단히 말하면 Database connection pool을 관리해준다는 것입니다. connection pool을 관리하는 것이 중요한 이유는 성능에 큰 영향을 미치기 때문입니다. 실제로 connection을 맺는 과정은 상당히 복잡할 뿐만 아니라 컴퓨터의 자원을 많이 소모하는 작업입니다.

HikariCP는 미리 정해놓은 만큼의 connection을 pool에 담아 놓고 요청이 들어오면 Thread가 connection을 요청하고, HikariCP는 Pool 내에 있는 connection을 연결해 줍니다.

 

 

Connection Pool이란?

 

Connection Pool이란 위의 그림처럼 Pool 속에 Database와의 연결(connection)을 미리 만들어 두고 Database에 접근 시 Pool에 남아 있는 Connection 중 하나를 받아와서 사용한 뒤 반환하는 기법을 말합니다.

 

 

 

Maven 종속성

HikariCP의 Java8~11의 경우 Maven dependency는 아래와 같습니다.

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.5</version>
</dependency>

java 6과 7 같은 이전 JDK 버전도 지원됩니다. 적절한 버전은 여기에서 검색해서 찾을 수 있습니다.

 

 

 

Spring에서의 사용법

HikariCP의 DataSource를 사용하여 애플리케이션에 대한 데이터 소스의 단일 인스턴스를 생성합니다.

public class DataSource {
 
    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;
 
    static {
        config.setJdbcUrl( "jdbc_url" );
        config.setUsername( "database_username" );
        config.setPassword( "database_password" );
        config.addDataSourceProperty( "cachePrepStmts" , "true" );
        config.addDataSourceProperty( "prepStmtCacheSize" , "250" );
        config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );
        ds = new HikariDataSource( config );
    }
 
    private DataSource() {}
 
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

 

여기서 주목할 점은 static 블록의 초기화 입니다.

HikariConfig는 DataSource를 초기화 하는데 사용되는 구성 클래스 입니다. 4개의 잘 알려진 필수 매개 변수인 username, password, jdbcUrl, dataSourceClassName이 함께 제공 됩니다.

 

xml을 통해 설정하는 방법은 다음과 같습니다. (oracle XE 11g)

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="driverClassName" 
    value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="jdbcUrl"
    value="jdbc:oracle:thin:@localhost:1521:XE"></property>
    <property name="username" value="username"></property>
    <property name="password" value="password"></property>
</bean>
 
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
    destroy-method="close">
    <constructor-arg ref="hikariConfig"/>
</bean>

 

이 외에도 아래와 같은 옵션들이 제공됩니다. 자세한 설명은 여기에서 확인할 수 있습니다.

  • autoCommit
    • auto-commit 설정(default:  true)
  • connectionTimeout
    • pool에서 connection을 얻어오기까지 기다리는 최대 시간
    • 허용가능한 시간을 초과하면 SQLException 발생.
    • default: 30,000(30s)
  • idleTimeout
    • pool에 일을 하지 않는 connection을 유지하는 시간
    • 이 옵션은 minimumIdle이 maximumPoolSize보다 작게 설정되어있을 때만 설정.
    • default:  600,000(10min)
  • maxLifetime
    • connection pool에서 살아 있을 수 있는 connection의 최대 수명 시간
    • 사용중인 connection은 maxLifetime에 상관없이 제거되지 않음
    • 0으로 설정하면 infinite lifetime이 적용됨(idleTimeout 설정 값에 따라 적용 idelTimeout값이 설정되어 있을 경우 0으로 설정해도 infinite lifetimeout 적용 안됨)
    • default: 1,800,000(30min)
  • connectionTestQuery
    • 이 옵션은 JDBC4를 지원안하는 드라이버를 위한 옵션
    • JDBC4 드라이버를 지원 한다면 이 옵션을 설정하지 않는 것을 추천
    • connection pool에서 connection을 획득하기 전에 살아있는 connection인지 확인하기 위한 valid query를 던지는데 사용(보통 select  1로 설정)
    • JDBC4 드라이버를 지원하지 않는 환경에서 이 값을 설정하지 않는다면 error 레벨 로그 발생
    • default:  none
  • minimumIdle
    • 아무런 일을 하지 않아도 적어도 이 옵션에 설정된 size로 connection을 유지해주는 옵션
    • default: same as maximumPoolSize
  • maximumPoolsize
    • pool에 유지시킬 수 있는 최대 connection
    • default:  10
  • readOnly
    • pool에서 connection을 획득할 때 read-only모드로 가져옴
    • 몇몇의 database는 read-only 모드를 지원하지 않음
    • default: false
  • driverClassName
    • HikariCP는 jdbcUrl을 참조하여 자동으로 driver를 설정하려고 시도함. 하지만 몇몇의 오래된 driver들은 driverClassName을 명시해야 함.
  • leakDetectionThreshold
    • connection이 누수 메시지가 나오기 전에 connection을 검사하여 pool에서 connection을 내보낼 수 있는 시간
    • 0으로 설정하면 leak detection을 이용하지 않음
    • 최소값:  2000ms
    • default: 0
728x90
loading