middle
Что такое HikariCP и как его настроить
HikariCP (от японского «свет») — это высокопроизводительная реализация пула JDBC-соединений, являющаяся стандартом в Spring Boot начиная с версии 2.0.
Почему HikariCP
- Высокая производительность — один из самых быстрых пулов за счёт оптимизаций на уровне байткода
- Малый размер — библиотека около 130 КБ
- Надёжность — строгое следование спецификации JDBC
- Стандарт Spring Boot — используется по умолчанию с версии 2.0
Ключевые параметры конфигурации
| Параметр | По умолчанию | Описание |
|---|---|---|
maximumPoolSize |
10 | Максимальное количество соединений в пуле |
minimumIdle |
= maximumPoolSize | Минимальное количество неактивных соединений |
connectionTimeout |
30 000 мс | Максимальное время ожидания соединения из пула |
idleTimeout |
600 000 мс | Максимальное время простоя соединения |
maxLifetime |
1 800 000 мс | Максимальное время жизни соединения |
poolName |
auto-generated | Имя пула (для мониторинга) |
leakDetectionThreshold |
0 (выкл.) | Время в мс, после которого соединение считается «утёкшим» |
Настройка в Spring Boot (application.yml)
Пример
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: app_user
password: secret
hikari:
maximum-pool-size: 15
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
pool-name: MyApp-Pool
leak-detection-threshold: 60000
Программная настройка HikariCP
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class HikariCPConfig {
public static DataSource createDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");
config.setUsername("app_user");
config.setPassword("secret");
config.setDriverClassName("org.postgresql.Driver");
config.setMaximumPoolSize(15);
config.setMinimumIdle(5);
config.setConnectionTimeout(30_000);
config.setIdleTimeout(600_000);
config.setMaxLifetime(1_800_000);
config.setPoolName("MyApp-Pool");
config.setLeakDetectionThreshold(60_000);
// Оптимизации для PostgreSQL
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
return new HikariDataSource(config);
}
}
Рекомендации для продуктивной среды
public class ProductionHikariConfig {
public static DataSource createProductionDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://db-host:5432/production");
config.setUsername(System.getenv("DB_USERNAME"));
config.setPassword(System.getenv("DB_PASSWORD"));
// Размер пула: (CPU cores * 2) + effective_spindle_count
config.setMaximumPoolSize(10);
config.setMinimumIdle(10); // В продакшене minimumIdle = maximumPoolSize
// maxLifetime должен быть меньше wait_timeout на стороне СУБД
config.setMaxLifetime(1_740_000); // 29 минут
config.setConnectionTimeout(10_000); // fail fast
config.setPoolName("Production-Pool");
config.setLeakDetectionThreshold(30_000);
config.setRegisterMbeans(true); // JMX мониторинг
return new HikariDataSource(config);
}
}
Важное
- В продуктивной среде minimumIdle рекомендуется устанавливать равным maximumPoolSize
- maxLifetime должен быть на несколько секунд меньше, чем таймаут на стороне СУБД
- poolName критически важен для мониторинга — особенно при нескольких источниках данных
- Включите leakDetectionThreshold в dev/stage-средах для обнаружения утечек
Частые ошибки
- Устанавливать maximumPoolSize = 50-100 — перегружает СУБД; обычно 10-20 достаточно
- Забывать настроить maxLifetime — соединения могут быть разорваны со стороны СУБД
- Не закрывать Connection (отсутствие try-with-resources) — утечка из пула
- Не включать мониторинг — невозможно диагностировать проблемы с пулом в продакшене
Как используется в 2026
- HikariCP 6.x — актуальная версия с поддержкой Java 21+ и виртуальных потоков
- В Spring Boot 3.x настраивается через
spring.datasource.hikari.* - Для cloud-native приложений параметры пула определяются через ConfigMap/Secrets в Kubernetes
- Интеграция с OpenTelemetry для распределённого трейсинга запросов к БД
На собеседовании: назовите 3-4 ключевых параметра (maximumPoolSize, connectionTimeout, maxLifetime, leakDetectionThreshold) и их типичные значения. Покажите, что знаете формулу размера пула. Частый вопрос: почему minimumIdle = maximumPoolSize в продакшене — ответ: исключает задержки на создание новых соединений при пиковой нагрузке.