Junior
Jak správně uzavřít spojení s databází?
sobes.tech AI
Odpověď od AI
Použití bloku try-with-resources.
// Deklarace zdrojů, které budou automaticky uzavřeny
try (
Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Získání objektu Connection
Statement statement = connection.createStatement(); // Vytvoření objektu Statement
ResultSet resultSet = statement.executeQuery("SELECT 1") // Spuštění dotazu a získání ResultSet
) {
// Práce s daty z ResultSet nebo jiné operace s databází
while (resultSet.next()) {
System.out.println(resultSet.getInt(1));
}
} catch (SQLException e) {
// Zpracování možných výjimek SQLException
e.printStackTrace();
}
Výhody tohoto přístupu:
- Automatické uzavření: Zdroje (Connection, Statement, ResultSet) budou garantovaně uzavřeny po opuštění bloku
try, i když dojde k výjimce. - Čistý kód: Není potřeba explicitně volat
close()vfinallybloku, což snižuje množství boilerplate kódu. - Zpracování výjimek: Pokud při uzavírání zdroje dojde k výjimce, nebude potlačena výjimkou, která vznikla uvnitř
trybloku.
Alternativní, méně doporučený způsob, s explicitním uzavřením v 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");
// Práce s daty
while (resultSet.next()) {
System.out.println(resultSet.getInt(1));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// Explicitní uzavření zdrojů v opačném pořadí
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();
}
}
}
Tento způsob je složitější a náchylnější k chybám, zejména při zpracování výjimek při uzavírání zdrojů. Doporučuje se používat try-with-resources.