본문 바로가기

IT

[Spring Boot] HikariCP

Spring Boot 에서 데이터베이스 관련 설정 값을 지정할 때 (ex. spring.datasource.hikari.jdbc-url) 사용하게 되는 hikari 에 대해 정리하고 싶었다.

 

Spring Boot 의 기본 커넥션 풀

Sprint Boot 2.0 부터 기본 커넥션 풀이 Tomcat 에서 HikariCP 로 변경되었다.

커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어서 Pool 에 담아뒀다가 요청이 들어오면 Pool 에 있는 커넥션을 연결해서 사용하고 다시 Pool에 반환하는 방식을 말한다.

어떤 부분이 좋아져서 기본 커넥션 풀이 변경된 것일까?

 

기존 커넥션 풀 보다 좋아진 점

위의 표는 JMH 벤치마크 결과이다.

JMH는 JVM을 대상으로 하는 Java와 다른 언어로 작성된 벤치마크를 빌드, 실행, 분석할 수 있다. 

Connection Cycle 은 DataSource.getConnection() / Connection.Close() 의 주기를 측정했다.

커넥션 풀에서 커넥션을 가져오고 다시 반납하는 주기를 측정한 벤치마크이다.

Statement Cycle 은 Connection.prepareStatement(), Statement.execute(), Statement.Close() 주기를 측정했다.

쿼리를 수행할 수 있는 객체를 만들고 쿼리를 실행하고 객체를 닫는(메모리의 연결을 해제하는) 주기를 측정한 벤치마크이다.

 

두 벤치마크 모두 HikariCP 가 압도적으로 높은 수치를 나타낸다. 즉, 커넥션 풀을 주고받는 시간도 짧아졌으며 쿼리를 실행할 수 있는 객체를 생성하고 쿼리를 수행하는 속도도 빨라졌다는 것이다.

 

Spring Boot 에서 설정하는 방법

pom.xml 에 의존성 정보를 추가한다.

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.1</version>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

application.properties 파일에 연결하는 데이터베이스의 설정 정보를 추가한다.

spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/echos_db?serverTimezone=UTC
spring.datasource.hikari.username=root
spring.datasource.hikari.password=1234

 

HikariDataSource Bean 을 생성한다. 나는 별도의 configuration class 에 추가했다.

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:/application.properties")
public class DatabaseConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariConfig hikariConfig() {
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() {
        DataSource dataSource = new HikariDataSource(hikariConfig());
        return dataSource;
    }
}

정상적으로 연결되면 아래와 같은 로그를 확인할 수 있다.

오랫동안 사용해보면서 생긴 문제/해결방안, 단점에 대해서도 다뤄야겠다.

 

 

참고자료

github.com/brettwooldridge/HikariCP

 

brettwooldridge/HikariCP

光 HikariCP・A solid, high-performance, JDBC connection pool at last. - brettwooldridge/HikariCP

github.com