Junior
Jak poprawnie zamknąć połączenie z bazą danych?
sobes.tech AI
Odpowiedź od AI
Używając bloku try-with-resources.
// Deklaracja zasobów, które będą automatycznie zamknięte
try (
Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Uzyskanie obiektu Connection
Statement statement = connection.createStatement(); // Utworzenie obiektu Statement
ResultSet resultSet = statement.executeQuery("SELECT 1") // Wykonanie zapytania i uzyskanie ResultSet
) {
// Praca z danymi z ResultSet lub wykonywanie innych operacji na bazie danych
while (resultSet.next()) {
System.out.println(resultSet.getInt(1));
}
} catch (SQLException e) {
// Obsługa możliwych wyjątków SQLException
e.printStackTrace();
}
Zalety tego podejścia:
- Automatyczne zamknięcie: Zasoby (Connection, Statement, ResultSet) będą gwarantowanie zamknięte po wyjściu z bloku
try, nawet jeśli wystąpią wyjątki. - Czysty kod: Nie wymaga jawnych wywołań
close()w blokufinally, co zmniejsza ilość kodu szablonowego. - Obsługa wyjątków: Jeśli podczas zamykania zasobu wystąpi wyjątek, nie będzie on ukryty przez wyjątek występujący w bloku
try.
Alternatywna, mniej preferowana metoda, z jawnym zamknięciem w bloku 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");
// Praca z danymi
while (resultSet.next()) {
System.out.println(resultSet.getInt(1));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// Jawne zamknięcie zasobów w odwrotnej kolejności
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();
}
}
}
Ta metoda jest bardziej skomplikowana i podatna na błędy, szczególnie przy obsłudze wyjątków podczas zamykania zasobów. Zaleca się używanie try-with-resources.