Junior
Как правилно да затворите връзката с базата данни?
sobes.tech AI
Отговор от 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.