Sobes.tech
Junior

Jak poprawnie zamknąć połączenie z bazą danych?

sobes.tech AI

Odpowiedź od AI

Używając bloku try-with-resources.

// Deklaracja zasobów, które będą automatycznie zamknięte
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Uzyskanie obiektu Connection
    Statement statement = connection.createStatement();  // Utworzenie obiektu Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Wykonanie zapytania i uzyskanie ResultSet
) {  
    // Praca z danymi z ResultSet lub wykonywanie innych operacji na bazie danych
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Obsługa możliwych wyjątków SQLException
    e.printStackTrace();  
}  

Zalety tego podejścia:

  • Automatyczne zamknięcie: Zasoby (Connection, Statement, ResultSet) będą gwarantowanie zamknięte po wyjściu z bloku try, nawet jeśli wystąpią wyjątki.
  • Czysty kod: Nie wymaga jawnych wywołań close() w bloku finally, co zmniejsza ilość kodu szablonowego.
  • Obsługa wyjątków: Jeśli podczas zamykania zasobu wystąpi wyjątek, nie będzie on ukryty przez wyjątek występujący w bloku try.

Alternatywna, mniej preferowana metoda, z jawnym zamknięciem w 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");  
    // Praca z danymi
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Jawne zamknięcie zasobów w odwrotnej kolejności
    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();  
        }  
    }  
}  

Ta metoda jest bardziej skomplikowana i podatna na błędy, szczególnie przy obsłudze wyjątków podczas zamykania zasobów. Zaleca się używanie try-with-resources.