Sobes.tech
Junior

Comment fermer correctement la connexion à la base de données?

sobes.tech IA

Réponse de l'IA

En utilisant le bloc try-with-resources.

// Déclaration des ressources qui seront automatiquement fermées
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Obtention de l'objet Connection
    Statement statement = connection.createStatement();  // Création de l'objet Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Exécution de la requête et obtention du ResultSet
) {  
    // Travailler avec les données du ResultSet ou effectuer d'autres opérations avec la base de données
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Gestion des exceptions SQLException possibles
    e.printStackTrace();  
}  

Avantages de cette approche :

  • Fermeture automatique : Les ressources (Connection, Statement, ResultSet) seront garanties fermées après la sortie du bloc try, même en cas d'exception.
  • Code propre : Ne nécessite pas d'appels explicites à close() dans le bloc finally, ce qui réduit la quantité de code boilerplate.
  • Gestion des exceptions : Si une exception survient lors de la fermeture de la ressource, elle ne sera pas supprimée par l'exception survenue dans le bloc try.

Méthode alternative, moins préférée, avec fermeture explicite dans le bloc 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");  
    // Travailler avec les données
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Fermeture explicite des ressources dans l'ordre inverse de leur obtention
    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();  
        }  
    }  
}  

Cette méthode est plus encombrante et sujette à des erreurs, notamment lors de la gestion des exceptions lors de la fermeture des ressources. Il est recommandé d'utiliser try-with-resources.