Junior
Kako pravilno zatvoriti vezu sa bazom podataka?
sobes.tech АИ
Одговор од АИ
Користећи блок 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.