Erreur JDBC ResultSet : "Opération non autorisée après la fermeture de ResultSet"
En Java, utiliser JDBC pour se connecter à une base de données et exécuter des requêtes via un ResultSet peut entraîner des erreurs si la connexion est fermée prématurément.
Cause :
Le ResultSet JDBC n'est pas une représentation complète des résultats de la requête. Au lieu de cela, il fournit une connexion en direct à la base de données, vous permettant de récupérer les résultats ligne par ligne. Si la connexion est fermée, le ResultSet perd sa connexion et devient invalide.
Message d'erreur :
java.sql.SQLException: Operation not allowed after ResultSet closed
Exemple de code :
Le code suivant illustre l'erreur :
<code class="java">ResultSet rs = null; Connection connection = null; Statement st = null; try { connection = DriverManager.getConnection("databaseadress","username","password"); st = connection.createStatement(); rs = st.executeQuery(query); } catch (...) {} // exception handling finally { if (rs != null) rs.close(); if (st!= null) st.close(); if (connection != null) connection.close(); }</code>
Dans ce code, l'erreur se produit car rs est toujours utilisé en dehors du bloc final, même après la fermeture de la connexion.
Solution :
Pour éviter cette erreur, vous devez remplir un objet ou une collection transitoire basée sur le ResultSet dans la portée de la connexion à la base de données. Une fois la connexion fermée, l'objet ou la collection transitoire peut être retourné ou utilisé sans aucun problème.
Code restructuré :
<code class="java">public static <T> List<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); List<T> list = new ArrayList<>(); while (rs.next()) { list.add(rowMapper.mapRow(rs)); } if (rs != null) rs.close(); if (st != null) st.close(); if (connection != null) connection.close(); return list; }</code>
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!