Ответ вслух Senior JDBC и транзакции обновлено

Настройка пула соединений

Вопрос

Как вы настраиваете пул соединений и что делаете, когда соединений не хватает?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Стартую с небольшого пула, десяток соединений, и проверяю нагрузкой: база не выполняет параллельно больше запросов, чем у неё ядер и дисков, а лишние соединения только конкурируют. Считаю суммарно: размер пула на число инстансов не должен превышать maxconnections базы, при многих инстансах ставлю PgBouncer.

Что должно прозвучать в ответе

  • Небольшой пул, ориентир на возможности БД, а не потоков приложения

  • connectionTimeout, maxLifetime меньше таймаутов сети и БД

  • leakDetectionThreshold для поиска утечек

  • Метрики пула: active, idle, pending

  • Причины нехватки: долгие транзакции, внешние вызовы в транзакции, медленные запросы

  • Суммарный размер пулов всех инстансов против max_connections

Что могут спросить следом

  • Зачем нужен PgBouncer, если есть HikariCP?
  • Как виртуальные потоки влияют на пул соединений?

Разбор

Стартую с небольшого пула, десяток соединений, и проверяю нагрузкой: база не выполняет параллельно больше запросов, чем у неё ядер и дисков, а лишние соединения только конкурируют. Считаю суммарно: размер пула на число инстансов не должен превышать max_connections базы, при многих инстансах ставлю PgBouncer. Задаю connectionTimeout, чтобы запрос падал быстро, а не висел, maxLifetime меньше таймаутов балансировщиков и базы, включаю leakDetectionThreshold. Слежу за метриками: активные, свободные, ожидающие соединения. Если не хватает, сначала ищу, почему соединения долго заняты: HTTP-вызов внутри транзакции, медленный запрос, N+1, забытое закрытие. С виртуальными потоками это особенно важно: тысячи потоков упрутся в тот же пул.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.