Назад к вопросам
Junior
71
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Используя блок try-with-resources.

// Объявление ресурсов, которые будут автоматически закрыты
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Получение объекта Connection
    Statement statement = connection.createStatement();  // Создание объекта Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Выполнение запроса и получение ResultSet
) {  
    // Работа с данными из ResultSet или выполнение других операций с базой данных
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Обработка возможных исключений SQLException
    e.printStackTrace();  
}  

Преимущества такого подхода:

  • Автоматическое закрытие: Ресурсы (Connection, Statement, ResultSet) будут гарантированно закрыты после выхода из блока try, даже если возникнут исключения.
  • Чистый код: Не требует явного вызова close() в блоке finally, что уменьшает количество boilerplate-кода.
  • Обработка исключений: Если во время закрытия ресурса возникнет исключение, оно не будет подавлено исключением, возникшим внутри блока try.

Альтернативный, менее предпочтительный способ с явным закрытием в блоке finally:

Connection connection = null;  
Statement statement = null;  
ResultSet resultSet = null;  

try {  
    connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");  
    statement = connection.createStatement();  
    resultSet = statement.executeQuery("SELECT 1");  
    // Работа с данными
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Явное закрытие ресурсов в порядке, обратном их получению
    if (resultSet != null) {  
        try {  
            resultSet.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    if (statement != null) {  
        try {  
            statement.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    if (connection != null) {  
        try {  
            connection.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
}  

Этот способ более громоздкий и подвержен ошибкам, особенно при обработке исключений во время закрытия ресурсов. Предпочтительным является использование try-with-resources.