
HikariCP в проде: пять настроек, которые часто крутят неправильно
badcasedaily1 50 минут назад HikariCP в проде: пять настроек, которые часто крутят неправильно Средний 15 мин 1.7K Блог компании OTUS Java * Программирование * PostgreSQL * Туториал Статья подготовлена в рамках курса...
Вот важная новость с фронта ИИ: badcasedaily1 50 минут назад HikariCP в проде: пять настроек, которые часто крутят неправильно Средний 15 мин 1. 7K Блог компании OTUS Java * Программирование * PostgreSQL * Туториал Статья подготовлена в рамках курса «Java разработчик. Экспертный уровень»JDBC connection pool в Spring Boot — это HikariCP.
Стоит из коробки с версии 2. properties обычно либо ничего не настроено, либо одна‑две строчки про размер пула. На небольшом трафике этого хватает: сервис работает, в пул никто не лезет, в графиках Grafana пустота, потому что метрики пула в Prometheus никто не вывел.
Технические детали
Пока в пиковую нагрузку в логах не начинает мелькать Connection is not available, request timed out after 30000ms или Connection is closed, и сервис на несколько минут уходит в полупараличное состояние — не падает, но и не работает. Половина таких инцидентов лечится тем, что в HikariCP оставлены или подкручены интуитивно не те параметры. В статье рассмотрим пять основных настроек, которые сильнее всего влияют на поведение пула под нагрузкой, плюс ещё пара важных, которые в большинстве проектов не настраивают вообще, плюс короткий обзор того, какие метрики HikariCP стоит выводить в мониторинг.
maximumPoolSize: «больше» не значит «лучше»Самая частая правка — maximumPoolSize=100 «на всякий случай», обычно с рассуждением: «У нас тысяча пользователей онлайн, надо много коннекшенов». На практике каждый коннекшн к Postgres — это процесс на стороне БД, несколько мегабайт оперативной памяти, контекст транзакций, кэш плана запросов. Сто параллельных запросов от одного бэкенда на типичный Postgres — это не «параллельность», а очередь, потому что CPU и диск всё равно один: задачи переключаются, и база начинает тратить на переключение контекстов больше времени, чем на сами запросы.
Автор HikariCP давно опубликовал pool sizing guide с формулой:connections = (core_count * 2) + effective_spindle_countДля 8 ядер + SSD это даёт 17 коннекшенов как достаточный размер пула на один инстанс. Не сто, и не пятьсот. Половина времени коннекшн ждёт диск или сеть, поэтому потоков может быть в два раза больше ядер — но не в десять.
Отраслевые последствия
Отдельный момент — корреляция с числом инстансов сервиса. Если у вас пять реплик Spring Boot, каждая с maximumPoolSize=20, это сто открытых коннекшенов к одной базе только от этого сервиса. У типичного Postgres max_connections равен 100–200, и часть из них уже занята другими сервисами, репликацией, мониторингом, психотерапевтом DBA.
Перешагнули — и новый под при старте не сможет подключиться вовсе, в логах будет FATAL: sorry, too many clients already.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





