Назад к вопросам
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.