Gymterview
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 в продакшене — ответ: исключает задержки на создание новых соединений при пиковой нагрузке.