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
Libérer: 2024-10-29 14:07:02
original
1037 Les gens l'ont consulté

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
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal