Sobes.tech
Junior

Πώς κλείνετε σωστά τη σύνδεση με τη βάση δεδομένων;

sobes.tech AI

Απάντηση από AI

Χρησιμοποιώντας το μπλοκ try-with-resources.

// Δήλωση πόρων που θα κλείσουν αυτόματα
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Απόκτηση αντικειμένου Connection
    Statement statement = connection.createStatement();  // Δημιουργία αντικειμένου Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Εκτέλεση ερωτήματος και λήψη ResultSet
) {  
    // Εργασία με δεδομένα από το ResultSet ή άλλες λειτουργίες βάσης δεδομένων
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Διαχείριση πιθανών εξαιρέσεων SQLException
    e.printStackTrace();  
}  

Πλεονεκτήματα αυτής της προσέγγισης:

  • Αυτόματο κλείσιμο: Οι πόροι (Connection, Statement, ResultSet) θα κλείσουν εγγυημένα μετά την έξοδο από το μπλοκ try, ακόμη και αν προκύψουν εξαιρέσεις.
  • Καθαρός κώδικας: Δεν απαιτούνται ρητές κλήσεις close() στο finally, μειώνοντας τον boilerplate κώδικα.
  • Διαχείριση εξαιρέσεων: Αν κατά το κλείσιμο πόρου προκύψει εξαίρεση, αυτή δεν θα καταπιεί την εξαίρεση που προκλήθηκε μέσα στο try.

Εναλλακτική, λιγότερο προτιμώμενη μέθοδος, με ρητό κλείσιμο στο 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");  
    // Εργασία με δεδομένα
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Ρητό κλείσιμο πόρων με αντίστροφη σειρά
    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();  
        }  
    }  
}  

Αυτή η μέθοδος είναι πιο πολύπλοκη και επιρρεπής σε σφάλματα, ειδικά κατά τη διαχείριση εξαιρέσεων κατά το κλείσιμο πόρων. Συνιστάται η χρήση του try-with-resources.