Какие последствия у незакрытого соединения с базой данных?

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

Ответ

Незакрытое соединение приводит к утечке ресурсов и потенциальному отказу приложения:

  • Утечка памяти и дескрипторов на стороне приложения и СУБД
  • Исчерпание пула соединений – новые запросы не смогут получить соединение
  • Блокировка ресурсов БД – активные соединения могут удерживать блокировки
  • Ограничение лицензионных подключений в коммерческих СУБД

Пример опасного кода (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 */ }
}

Рекомендации:

  1. Всегда используйте try-with-resources для AutoCloseable объектов
  2. Закрывайте ресурсы в порядке, обратном созданию (ResultSet → Statement → Connection)
  3. Используйте пулы соединений (HikariCP, Apache DBCP) для управления жизненным циклом