Sobes.tech
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() v finally bloku, 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ř try bloku.

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.