HikariCP - 데이터베이스 연결 풀
무엇인가
데이터베이스에 새 연결을 만들려면 특히 인증이 있을 때 일정한 처리가 필요합니다.
따라서 성능을 더 높이려면 연결을 재사용하고 지속적으로 새 연결을 열지 않는 것이 좋습니다.
이 문제를 해결하기 위해 연결 풀을 사용합니다. 연결이 해제될 때 실제로 닫히고 파괴되지 않고, 나중에 새 연결이 필요할 때 재사용할 수 있도록 대기 상태에 놓입니다.
이는 큰 성능 향상을 가져오며, 데이터베이스 과부하를 피하기 위해 최대 연결 수를 제한하는 가장 잘 알려진 설정을 포함하여 훨씬 더 많은 구성 매개변수를 허용합니다.
HikariCP
Hikari는 일본어로 빛을 의미합니다. HikariCP는 Java 애플리케이션에서 가장 효율적이고 널리 사용되며, 단연 최고의 성능을 자랑하는 것으로 유명합니다.
HikariCP의 공식 저장소는 GitHub에서 찾을 수 있습니다. 성능 차트와 구성 정보를 확인하세요.
Netuno는 HikariCP를 사용하여 PostgreSQL, MariaDB, Microsoft SQL Server 및 Oracle 연결을 관리합니다.
구성
Netuno에서 HikariCP 구성은 애플리케이션의 데이터베이스 구성과 함께 수행됩니다.
즉, 애플리케이션 내 config 폴더의 환경 구성에서 수행됩니다. 예:
- _development.json
- _production.json
"db" 섹션에는 데이터베이스 구성이 포함됩니다.
기본 연결과 다른 모든 연결 모두에 대해 동일한 방식으로 HikariCP 매개변수를 구성할 수 있습니다.
따라서 host, port, name(database), username 및 password가 있는 default 내부에 다음과 같이 HikariCP 매개변수를 더 추가하기만 하면 됩니다:
...
"db": {
"default": {
"engine": "pg",
"host": "localhost",
"port": 5432,
"name": "nae_database",
"username": "nae_sayongja",
"password": "bimil",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000
}
}
...
예를 들어, 위의 각 추가 HikariCP 설정은 다음과 같은 용도입니다:
maximumPoolSize는 HikariCP의 최대 연결 크기를 정의하며, 이 예에서는 연결 제한이 25입니다.minimumIdle은 사용되기 위해 대기열에서 대기하는 최소 연결 수를 정의합니다.idleTimeout은 연결이 대기 상태로 있을 수 있는 시간입니다.maxLifetime은 연결의 최대 수명입니다.
HikariCP 구성은 데이터베이스 엔진 구성과 일치해야 합니다. 예를 들어, 최대 연결 수와 제한 시간은 데이터베이스 엔진에 정의된 값을 절대 초과해서는 안 됩니다.
다른 모든 HikariCP 매개변수도 같은 방식으로 구성할 수 있으며, 원하는 구성 매개변수를 추가하기만 하면 됩니다.
매개변수
아래에는 Netuno가 HikariCP에 대해 구성할 수 있도록 허용하는 매개변수 목록이 있습니다.
그 외의 HikariCP 구성 매개변수는 Netuno가 자동으로 미리 정의하거나, 적용 대상이 아닙니다.
자주 사용되는 항목
autoCommit
이 속성은 풀에서 반환된 연결의 기본 자동 커밋 동작을 제어합니다. 부울 값입니다.
기본값: true
connectionTimeout
이 속성은 클라이언트(즉, 사용자)가 풀에서 연결을 기다리는 최대 시간(밀리초)을 제어합니다. 이 시간이 초과될 때까지 사용 가능한 연결이 없으면 SQLException이 발생합니다. 허용되는 최소 연결 제한 시간은 250ms입니다.
기본값: 30000 (30초)
idleTimeout
이 속성은 연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간을 제어합니다. 이 설정은 minimumIdle이 maximumPoolSize보다 작게 설정된 경우에만 적용됩니다. 풀이 minimumIdle 연결에 도달하면 유휴 연결은 제거되지 않습니다. 연결이 비활성으로 제거되는지 여부는 최대 +30초, 평균 +15초의 변동을 따릅니다. 연결은 이 제한 시간 전에 유휴 상태로 폐기되지 않습니다. 값이 0이면 유휴 연결이 풀에서 절대 제거되지 않습니다. 허용되는 최소값은 10000ms(10초)입니다.
기본값: 600000 (10분)
maxLifetime
이 속성은 풀에서 연결의 최대 수명을 제어합니다. 사용 중인 연결은 절대 제거되지 않으며, 닫힌 경우에만 제거됩니다. 연결별 기준으로 풀에서 대량 추출을 피하기 위해 더 작은 음수 감쇠가 적용됩니다. 이 값을 설정하는 것을 강력히 권장하며, 데이터베이스나 인프라에서 부과하는 연결 제한 시간보다 몇 초 더 짧아야 합니다. 값이 0이면 최대 수명(무한 기간)을 나타내며, 물론 idleTimeout 설정이 적용됩니다. 허용되는 최소값은 30000ms(30초)입니다.
기본값: 1800000 (30분)
minimumIdle
이 속성은 HikariCP가 풀에서 유지하려고 시도하는 최소 유휴 연결 수를 제어합니다. 유휴 연결이 이 값 아래로 떨어지고 풀의 총 연결 수가 maximumPoolSize 크기보다 작으면 HikariCP는 추가 연결을 빠르고 효율적으로 추가하기 위해 최선을 다합니다. 그러나 최대 성능과 최고 수요에 대한 응답성을 위해 이 값을 설정하지 않고 HikariCP가 고정 크기 연결 풀처럼 작동하도록 하는 것이 좋습니다.
기본값: maximumPoolSize 크기와 동일
maximumPoolSize
이 속성은 유휴 연결과 사용 중인 연결을 모두 포함하여 풀이 도달할 수 있는 최대 크기를 제어합니다. 기본적으로 이 값은 데이터베이스 백엔드에 대한 실제 최대 연결 수를 결정합니다. 이에 대한 합리적인 값은 실행 환경에 따라 결정하는 것이 가장 좋습니다. 풀이 이 크기에 도달하고 사용 가능한 유휴 연결이 없으면 getConnection() 호출은 제한 시간 전 connectionTimeout 밀리초까지 차단됩니다.
기본값: 10
덜 사용되는 항목
initializationFailTimeout
이 속성은 풀이 초기 연결로 성공적으로 시드될 수 없을 때 풀이 "빠르게 실패"할지 여부를 제어합니다. 양수는 초기 연결을 획득하려고 시도하는 밀리초 수로 간주되며, 이 기간 동안 애플리케이션 스레드가 차단됩니다. 이 시간 간격 전에 연결을 획득할 수 없으면 예외가 발생합니다. 이 제한 시간은 connectionTimeout 기간 이후에 적용됩니다. 값이 0이면 HikariCP가 연결을 얻고 검증하려고 시도합니다. 연결을 얻었지만 검증에 실패하면 예외가 발생하고 풀은 시작되지 않습니다. 그러나 연결을 얻을 수 없으면 풀은 시작되지만 이후 연결 획득 시도가 실패할 수 있습니다. 값이 0보다 작으면 초기 연결 시도를 우회하고 풀은 백그라운드에서 연결을 얻으려고 시도하면서 즉시 시작됩니다. 따라서 이후 연결 획득 시도가 실패할 수 있습니다.
기본값: 1
catalog
이 속성은 카탈로그 개념을 지원하는 데이터베이스의 기본 카탈로그를 정의합니다. 이 속성을 지정하지 않으면 JDBC 드라이버에서 정의한 기본 카탈로그가 사용됩니다.
기본값: 드라이버 기본값
validationTimeout
이 속성은 연결의 활성 여부를 테스트하는 최대 시간을 제어합니다. 이 값은 connectionTimeout 시간보다 작아야 합니다. 허용되는 최소 검증 제한 시간은 250ms입니다.
기본값: 5000
leakDetectionThreshold
이 속성은 연결 누수 가능성을 나타내는 메시지가 기록되기 전에 연결이 풀 밖에 있을 수 있는 시간을 제어합니다. 값이 0이면 누수 감지가 비활성화됩니다. 누수 감지를 허용하는 최소 허용 값은 2000(2초)입니다.
기본값: 0
schema
이 속성은 스키마 개념을 지원하는 데이터베이스의 기본 스키마를 정의합니다. 이 속성을 지정하지 않으면 JDBC 드라이버에서 정의한 기본 스키마가 사용됩니다.
기본값: 드라이버 기본값
DataSource
DataSource에 구성, 즉 사용 중인 데이터베이스 유형에 특정한 추가 구성을 추가할 수도 있습니다.
이 고급 구성을 수행하려면 데이터베이스 연결 구성 객체 내부에 datasource 구성 객체를 추가해야 합니다.
예를 들어 다음과 같습니다:
...
"db": {
"default": {
"engine": "mariadb",
"host": "localhost",
"port": 3306,
"name": "nae_database",
"username": "nae_sayongja",
"password": "bimil",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000,
"datasource": {
"cachePrepStmts": "true",
"prepStmtCacheSize": 250,
"prepStmtCacheSqlLimit": 2048
}
}
}
...
DataSource 매개변수 구성 값은 string 유형입니다. 어쨌든 Netuno는 항상 자동으로 _string_으로 변환합니다.
결론
HikariCP를 사용하면 데이터베이스 연결의 부하와 동작을 관리하기 위한 고급 구성을 수행할 수 있습니다.
다양한 시나리오에 맞게 최적화하여 높은 성능을 보장할 수 있습니다.