Карта / PostgreSQL / Пулы (Hikari)

Пулы (Hikari)

Открытие соединения с базой данных — дорогая операция (сетевое рукопожатие, аутентификация). Создавать новое соединение на каждый запрос к базе — медленно и расточительно. Пул соединений держит набор уже открытых соединений наготове и раздаёт их по запросу — так же, как пул потоков избавляет от пересоздания потоков (см. тему «ExecutorService»).

HikariCP — самый быстрый и популярный пул соединений в Java-экосистеме, используется по умолчанию в Spring Boot:

spring:
  datasource:
    hikari:
      maximum-pool-size: 10    # максимум одновременных соединений
      minimum-idle: 5            # минимум "дежурных" соединений наготове
      connection-timeout: 30000  # сколько ждать свободное соединение (мс)
Копнуть глубже

Как это работает: приложение запрашивает соединение из пула → использует его для запроса к базе → возвращает обратно в пул (не закрывает физически) → соединение готово для следующего запроса.

Размер пула — не “чем больше, тем лучше”. Слишком большой пул создаёт лишнюю нагрузку на сервер базы данных (каждое соединение потребляет память на стороне БД) и может даже замедлить работу из-за конкуренции за ресурсы базы. Правило по умолчанию для HikariCP: число соединений примерно равно ((число ядер процессора × 2) + число дисков) — для большинства приложений 10 соединений более чем достаточно, даже при высокой нагрузке.

Что произойдёт, если все соединения заняты. Новый запрос ждёт освобождения соединения до connection-timeout, и если не дождался — падает с исключением. Это защита от перегрузки базы: лучше явная ошибка, чем неконтролируемый рост числа подключений до отказа базы.

🎤 Закрыл тему, если можешь объяснить:
• зачем нужен пул соединений вместо создания нового на каждый запрос;
• почему больший пул — не всегда лучше (если дошёл до 2-го слоя).