Sobes.tech
Junior

Kuidas õigesti sulgeda andmebaasiga ühendus?

sobes.tech AI

Vastus AI-lt

Kasutades try-with-resources plokki:

// Ressursside deklaratsioon, mis suletakse automaatselt
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Connection objekti saamine
    Statement statement = connection.createStatement();  // Statement objekti loomine
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Päringu täitmine ja ResultSet saamine
) {  
    // Töö ResultSeti andmetega või teiste andmebaasi operatsioonidega
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Võimalike SQLException-de töötlemine
    e.printStackTrace();  
}  

Selle lähenemise eelised:

  • Automaatne sulgemine: Ressursid (Connection, Statement, ResultSet) suletakse garanteeritult pärast try ploki väljasaamist, isegi kui tekib erind.
  • Puhtam kood: Ei nõua close() väljakutset finally plokis, mis vähendab boilerplate-koodi.
  • Erindite töötlemine: Kui ressursi sulgemise ajal tekib erind, ei varjata seda try plokis tekkinud erindi.

Alternatiivne, vähem soovitatav viis — selge sulgemine finally plokis:

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");  
    // Andmete töötlemine
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Ressursside selge sulgemine vastupidises järjekorras
    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();  
        }  
    }  
}  

See meetod on mahukam ja suurema tõenäosusega vigu, eriti ressursside sulgemise ajal tekkivate erindite töötlemisel. Soovitatav on kasutada try-with-resources.