본문 바로가기
Programing/Java

[Java] Spring Boot에서 HikariCP 설정

by AustinProd 2022. 11. 11.

최근 유지 보수하는 서비스에 사용자가 몰리면서 DB 커넥션 관리를 위해 DB 튜닝과 HikariCP 설정 변경을 진행했다. 이번 포스트에서 HikariCP 설정에 대해 정리하는 내용을 담으려고 한다.

 

HikariCP 설정 이유

Spring Boot 2.0 버전부터 HikariCP가 디폴트 JDBC Connection Pool 관리 도구로 적용된다. 주로 Spring Boot 환경에서 작업하는 나에게 HikariCP는 프로퍼티 파일에서 쉽게 확인할 수 있는 툴이다.

 

HikariCP는 API에서 DB Connection를 관리한다. 얼마만큼 Pool을 주고, 유지할 건지. 트렌젝션 유효시간(idle time-out)은 얼마로 설정할 건지 등을 설정할 수 있다.

 

이러한 설정을 제대로 해주지 않으면, API에 들어온 요청이 제 때 처리되지 못해 요청이 지연되거나 DB Table에 Lock이 걸리는 이슈가 발생할 수 있다. HikariCP를 설정한다는 건 API에서 DB와의 연결을 건강하게 유지시키는 작업이라고 할 수 있다.

 

# HikariPool 로그 예시
2022-11-11 10:40:15.931 [HikariPool-1 housekeeper] HikariPool - HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0)
2022-11-11 10:40:15.931 [HikariPool-1 housekeeper] HikariPool - HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0)
2022-11-11 10:40:15.931 [HikariPool-1 housekeeper] HikariPool - HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0)
2022-11-11 10:40:15.931 [HikariPool-1 housekeeper] HikariPool - HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0)

 

HikariCP 설정 방법

내 경우에 HikariCP 설정 값은 프로퍼티 파일(.properties)에서 관리한다. Gradle을 사용하는 경우 .yml 파일에서 설정할 수 있다. 아래 코드를 참고해서 각각 환경에 맞춰 적용하면 된다.

 

application.properties 설정

spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://192.168.0.123:3306/sample?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul&useSSL=false
spring.datasource.hikari.username=user
spring.datasource.hikari.password=1234

spring.datasource.hikari.connectionTimeout=9000
spring.datasource.hikari.idleTimeout=9000
spring.datasource.hikari.maxLifetime=9000
spring.datasource.hikari.maximumPoolSize=50
spring.datasource.hikari.minimumIdle=10

 

application.yml 파일 설정

spring:
  datasource:
    url: jdbc:mysql://192.168.0.123:3306/sample?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul&useSSL=false
    username: user
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      connection-timeout: 9000
      max-lifetime: 9000
      minimum-idle: 10
      maximum-pool-size: 50

 

HikariCP 설정값 ( .properties 기준 )

아래 항목에서 HikariPoop 설정에 사용되는 기본 설정값을 정리했다. 


connectionTimeout

> Pool에서 커넥션 연결까지 걸릴 수 있는 최대 대기 시간. 이 시간이 지나도록 응답이 없으면 Time-out 예외가 발생한다. (Default, 30000ms)

 

validationTimeout

> 연결된 커넥션이 유효한지 검증하는 최대 시간 (Default, 5000ms)

 

idleTimeout

> Pool에서 유휴 상태로 대기하고 있는 커넥션들이 유지될 수 있는 최대 시간. 이 값은 minimumIdle(최소 유지 Pool 수)이 maximumPoolSize(최대 확장 Pool 수) 보다 작을 때만 적용된다. (Default, 600000 ms)

 

maxLifetime

> 커넥션 최대 연결 시간. 이 시간이 지난 커넥션은 재연결된다. 사용 중인 커넥션은 제거되지 않고, Pool에 돌아오는 순간 제거된다. (Default, 1800000 ms)

> DB waite time-out 값보다 짧게 유지하는 것이 권장된다.

 

maximumPoolSize

> 사용 중인 Pool과 대기 상태의 Pool을 합쳤을 때, 최대 허용 커넥션 수 (Default, 10ms) 

 

minimumIdle

> Pool이 유지되는 동안 연결될 최소 커넥션 수. maximumPoolSize의 값을 넘을 수 없다.


'Programing > Java' 카테고리의 다른 글

[Java & Tomcat] Port already in use 에러  (0) 2022.06.26

댓글