Ответ
Незакрытое соединение приводит к утечке ресурсов и потенциальному отказу приложения:
- Утечка памяти и дескрипторов на стороне приложения и СУБД
- Исчерпание пула соединений – новые запросы не смогут получить соединение
- Блокировка ресурсов БД – активные соединения могут удерживать блокировки
- Ограничение лицензионных подключений в коммерческих СУБД
Пример опасного кода (Java):
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// Соединение никогда не закрывается!
Правильный подход с try-with-resources (Java 7+):
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users");
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
// обработка результатов
}
} // Все ресурсы закрываются автоматически
Альтернатива – явное закрытие в finally:
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM users");
// работа с результатами
} finally {
if (rs != null) try { rs.close(); } catch (SQLException e) { /* log */ }
if (stmt != null) try { stmt.close(); } catch (SQLException e) { /* log */ }
if (conn != null) try { conn.close(); } catch (SQLException e) { /* log */ }
}
Рекомендации:
- Всегда используйте try-with-resources для AutoCloseable объектов
- Закрывайте ресурсы в порядке, обратном созданию (ResultSet → Statement → Connection)
- Используйте пулы соединений (HikariCP, Apache DBCP) для управления жизненным циклом