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\' dans Java JDBC ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 19:01:02784parcourir

Why Am I Getting

Java : Erreur lors de l'utilisation de ResultSet après la fermeture de la connexion

Lors de la tentative de récupération de données d'une base de données MySQL à l'aide de JDBC, les utilisateurs peuvent rencontrer l'erreur : "java.sql.SQLException : opération non autorisée après la fermeture de ResultSet." Cela se produit lorsque vous essayez d'utiliser un objet ResultSet après la fermeture de la connexion sous-jacente.

Explication

JDBC fonctionne sur un concept de chargement paresseux, où les résultats d'un Les requêtes ne sont pas entièrement récupérées tant qu'elles ne sont pas demandées. L'objet ResultSet fournit un curseur sur les résultats, vous permettant de les parcourir. Cependant, fermer la connexion qui a créé le ResultSet ferme également le curseur, le rendant inutilisable.

Solution

Pour éviter cette erreur, il faut soit garder la connexion ouverte jusqu'à ce que le ResultSet n'est plus nécessaire ou utilisez une approche différente.

Une approche recommandée consiste à utiliser un mappeur de lignes pour convertir l'ensemble de résultats en une collection d'objets. Cette méthode encapsule le processus de conversion et vous permet d'accéder aux résultats même après la fermeture de la connexion :

<code class="java">public static List<T> sqlquery(String query, RowMapper<T> rowMapper) throws SQLException {
    try (Connection connection = DriverManager.getConnection(...);
         Statement st = connection.createStatement();
         ResultSet rs = st.executeQuery(query)) {
        List<T> list = new ArrayList<>();
        while (rs.next()) {
            list.add(rowMapper.mapRow(rs));
        }
        return list;
    }
}</code>

Ce code modifié utilise try-with-resources pour garantir que la connexion, l'instruction et l'ensemble de résultats sont automatiquement fermés une fois la méthode terminée, éliminant la possibilité d'oublier de les fermer manuellement. De plus, il utilise un mappeur de lignes pour convertir chaque ligne de l'ensemble de résultats en un objet renseigné, qui peut ensuite être collecté dans une liste.

Conclusion

En comprenant Grâce au mécanisme de chargement paresseux de JDBC et à l'utilisation de mappeurs de lignes, les développeurs peuvent récupérer efficacement les données des bases de données tout en évitant les erreurs liées aux ResultSets fermés après la fermeture de la connexion.

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