Ответ
Пул соединений решает проблему высоких накладных расходов на установление и разрыв соединения с базой данных для каждого запроса. Вместо этого он заранее создаёт и поддерживает набор (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();
// ... обработка результата
} // При закрытии соединение НЕ разрывается, а возвращается в пул
}
Ключевые преимущества:
- Производительность: Избегание дорогостоящих операций
connect/disconnect. - Контроль ресурсов: Ограничение максимального числа одновременных соединений с БД.
- Надёжность: Пул может проверять валидность соединений (
connectionTestQuery) и восстанавливать их при обрыве.
Пул соединений является стандартным компонентом в высоконагруженных приложениях.