Какую проблему решает пул соединений (connection pool) при работе с базами данных?

«Какую проблему решает пул соединений (connection pool) при работе с базами данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пул соединений решает проблему высоких накладных расходов на установление и разрыв соединения с базой данных для каждого запроса. Вместо этого он заранее создаёт и поддерживает набор (pool) активных соединений, которые переиспользуются.

Проблема без пула:

// НЕЭФФЕКТИВНО: для каждого запроса
for (Request req : requests) {
    Connection conn = DriverManager.getConnection(URL, USER, PASS); // Медленно!
    // ... выполнение запроса
    conn.close(); // Разрыв соединения
}

Решение с пулом (на примере HikariCP):

// Инициализация пула (обычно один раз при старте приложения)
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("user");
config.setPassword("pass");
config.setMaximumPoolSize(10); // Максимум 10 соединений
config.setConnectionTimeout(30000); // Таймаут на получение соединения

HikariDataSource dataSource = new HikariDataSource(config);

// Использование в коде
public User getUser(int id) {
    try (Connection conn = dataSource.getConnection()) { // Берёт из пула
         PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
         stmt.setInt(1, id);
         ResultSet rs = stmt.executeQuery();
         // ... обработка результата
    } // При закрытии соединение НЕ разрывается, а возвращается в пул
}

Ключевые преимущества:

  1. Производительность: Избегание дорогостоящих операций connect/disconnect.
  2. Контроль ресурсов: Ограничение максимального числа одновременных соединений с БД.
  3. Надёжность: Пул может проверять валидность соединений (connectionTestQuery) и восстанавливать их при обрыве.

Пул соединений является стандартным компонентом в высоконагруженных приложениях.