Зачем нужен пул соединений и почему его размер обычно невелик?
- Как выбрать размер HikariCP?
Соединение дорого создавать (TCP, TLS, аутентификация, процесс на сервере), а лишние активные соединения не ускоряют базу: её параллелизм ограничен ядрами и дисками.
- Отправная точка: ядра базы × 2 + диски
- Сумма пулов всех экземпляров не должна превышать возможности базы — иначе PgBouncer
- Ожидание в пуле видно и управляемо; очередь внутри базы — нет
А ещё Не держать соединение во время внешних вызовов
Подробно
Открытие соединения включает сетевое рукопожатие, аутентификацию и выделение ресурсов на стороне СУБД, поэтому создавать его на каждый запрос недопустимо. Но и раздувать пул бессмысленно: параллелизм базы ограничен процессорами и вводом-выводом, а лишние активные соединения добавляют переключений контекста и конкуренции за блокировки — пропускная способность падает, а задержки растут. Практический ориентир для OLTP — десятки соединений, а не сотни; при этом суммарно по всем инстансам приложения пул не должен превышать лимит базы. Занятый пул при низкой загрузке CPU приложения — верный признак, что узкое место именно здесь.
Что хотят услышать
- Цена соединения и зачем пул.
- Почему пул должен быть маленьким.
- Сумма пулов экземпляров и прокси-пулер.
Частые ошибки
- Наращивать пул при росте задержек — обычно становится хуже.
- Не учитывать, что пул умножается на число инстансов приложения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Пул нужен для кэширования результатов запросов
- ✓Открывать соединение дорого, а лишние соединения сверх возможностей БД лишь усиливают конкуренцию
- ✗Размер пула должен совпадать с числом одновременных пользователей приложения
- ✗Пул нужен только для распределённых транзакций
Что спросят дальше
- Что произойдёт при исчерпании пула?
- Почему долгие транзакции особенно вредны для пула?
Разбор темы
- JDBC и безопасные запросы
Connection/Statement/ResultSet, PreparedStatement против инъекций, ручные транзакции, ресурсы и пул соединений.
Связанные вопросы
- Зачем нужен пул соединений к базе и как выбрать его размер? Middle
- Сервер приложений загружен на 30% по CPU, но задержки растут, а пул соединений к базе занят полностью. Что даст добавление ещё нескольких серверов приложений? Middle
- Как в JDBC выполнить несколько операций в одной транзакции вручную? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.