Sobes.tech
Junior

Ako správne ukončiť spojenie s databázou?

sobes.tech AI

Odpoveď od AI

Použitie bloku try-with-resources.

// Vyhlásenie zdrojov, ktoré budú automaticky zatvorené
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Získanie objektu Connection
    Statement statement = connection.createStatement();  // Vytvorenie objektu Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Spustenie dotazu a získanie ResultSet
) {  
    // Práca s údajmi z ResultSet alebo vykonávanie iných operácií s databázou
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Spracovanie možných výnimiek SQLException
    e.printStackTrace();  
}  

Výhody tohto prístupu:

  • Automatické zatváranie: Zdroje (Connection, Statement, ResultSet) budú garantovane zatvorené po opustení bloku try, aj keď dôjde k výnimke.
  • Čistý kód: Nevyžaduje explicitné volanie close() v bloku finally, čo znižuje množstvo boilerplate kódu.
  • Spracovanie výnimiek: Ak počas zatvárania zdroja dôjde k výnimke, nebude potlačená výnimkou, ktorá vznikla vo vnútri bloku try.

Alternatívny, menej preferovaný spôsob s explicitným zatváraním v 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");  
    // Práca s údajmi
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Explicitné zatváranie zdrojov v opačnom poradí ich získania
    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 spôsob je objemnejší a náchylnejší na chyby, najmä pri spracovaní výnimiek počas zatvárania zdrojov. Odporúča sa používať try-with-resources.