Ответ
Незакрытое ("висящее") соединение удерживает следующие ресурсы на стороне сервера СУБД:
- Память: Под структуры данных сессии, буферы и контекст выполнения.
- Управление соединениями: Занятый слот в пуле соединений, что может привести к его исчерпанию для других приложений.
- Блокировки: Если соединение оставило транзакцию открытой (
autocommit=false), удерживаемые блокировки могут препятствовать работе других сессий. - Временные объекты: Курсоры или временные таблицы могут не освобождаться своевременно.
Пример плохой практики (утечка соединения):
Connection conn = DriverManager.getConnection(url);
// Работа с БД...
// Забыли вызвать conn.close() - соединение остается активным.
Как избежать:
- Всегда используйте
try-with-resources(Java 7+) для гарантированного закрытия:try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) { // Работа с БД } // conn.close() вызывается автоматически. - Настройте таймауты в пуле соединений (например,
idleTimeoutв HikariCP). - Используйте шаблоны (например,
JdbcTemplateв Spring), которые управляют жизненным циклом соединения за вас.