Пулы (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-го слоя).