Maison >base de données >tutoriel mysql >Pourquoi est-ce que j'obtiens \'java.sql.SQLException : opération non autorisée après la fermeture de ResultSet\' lors de l'utilisation de JDBC ?

Pourquoi est-ce que j'obtiens \'java.sql.SQLException : opération non autorisée après la fermeture de ResultSet\' lors de l'utilisation de JDBC ?

DDD
DDDoriginal
2024-10-29 14:07:02928parcourir

Why Am I Getting

Java - Impossible d'utiliser ResultSet après la fermeture de la connexion

Problème :

Une tentative de exécuter une requête de base de données à l'aide de JDBC entraîne l'erreur suivante :

java.sql.SQLException: Operation not allowed after ResultSet closed

Analyse :

JDBC utilise un objet ResultSet pour récupérer les données d'une requête. Cependant, lorsque la connexion à la base de données est fermée, l'objet ResultSet devient invalide et ne peut plus être utilisé.

Solution :

Pour résoudre ce problème, évitez de passer l'objet ResultSet au-delà de la méthode qui a exécuté la requête. Au lieu de cela, utilisez ResultSet pour remplir un objet ou une liste et renvoyer cet objet résultant.

Exemple de code avec remplissage d'objets :

<code class="java">public static Collection<T> sqlquery (String query, RowMapper<T> rowMapper) throws SQLException
{
    Connection connection=null;
    Statement st=null;
    ResultSet rs=null;     
    connection = DriverManager.getConnection("databaseadress","username","password");
    st = connection.createStatement();  
    rs = st.executeQuery(query);
    Collection<T> collection = new ArrayList<>();
    while (rs.next()) {
        collection.add(rowMapper.mapRow(rs));
    }
    // Close resources even if exceptions are thrown
    closeGracefully(rs, st, connection);
    return collection;
}</code>

Fermer les ressources avec élégance :

<code class="java">private static void closeGracefully(ResultSet rs, Statement st, Connection connection) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (st != null) {
        try {
            st.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
}</code>

Considérations supplémentaires :

  • Utilisez un mappeur de lignes pour créer des objets à partir de chaque ligne du ResultSet.
  • Paramétrez les requêtes pour empêcher les attaques par injection SQL.
  • Envisagez d'utiliser des bibliothèques tierces telles que JDBC ou Spring JDBC pour un accès simplifié à la base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn