Сколько соединений с базой данных должно быть в Java-приложении: одно или пул?

«Сколько соединений с базой данных должно быть в Java-приложении: одно или пул?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В подавляющем большинстве случаев следует использовать пул соединений (connection pool), а не одно соединение.

Проблемы одного соединения:

  • Боттлнек (узкое место): Все запросы ждут освобождения единственного соединения.
  • Низкая производительность: Невозможность параллельного выполнения операций с БД.
  • Ненадежность: Разрыв соединения приводит к полной неработоспособности приложения.

Преимущества пула соединений (HikariCP, Apache DBCP, Tomcat JDBC):

  • Высокая производительность: Множество потоков могут работать с БД одновременно.
  • Управление ресурсами: Пул создает, проверяет и переиспользует соединения.
  • Гибкая настройка: Можно задать минимальный, максимальный размер пула, таймауты.

Пример настройки HikariCP (де-факто стандарт) в Spring Boot:

# application.yml
spring:
  datasource:
    hikari:
      maximum-pool-size: 10      # Максимум соединений
      minimum-idle: 5            # Минимум простаивающих соединений
      connection-timeout: 30000  # Таймаут на получение соединения (мс)
      idle-timeout: 600000       # Макс время простоя соединения (мс)

Когда может хватить одного соединения? Только в крайне простых, однопоточных приложениях (например, утилиты командной строки). Даже в этом случае использование пула с minimumIdle=1 и maximumPoolSize=1 обеспечивает стандартизированное управление жизненным циклом соединения.