Vorgang nicht zulässig: ResultSet Closed Exception in Java
Beim Ausführen bestimmter SQL-Abfragen können Entwickler auf eine „java.sql.SQLException“ stoßen: „Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde“-Ausnahme. Dieser Fehler tritt normalerweise auf, wenn mehrere ResultSets gleichzeitig vom selben Statement-Objekt versucht werden.
Betrachten Sie den folgenden Codeausschnitt, der dieses Problem veranschaulicht:
// Problem code: using the same statement object to create multiple ResultSets try { // Execute the first query and obtain ResultSet rs ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;"); // Execute the second query and obtain ResultSet rs2 ResultSet rs2 = statement.executeQuery("SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";"); // Prepare a new statement and attempt to use rs2 PreparedStatement pst = (PreparedStatement)connection.prepareStatement("INSERT INTO `blah`............"); // Process data from rs2 and update the database using pst while(rs2.next()) { int id = rs2.getInt("id"); int stuff = getStuff(id); pst.setInt(1, stuff); pst.addBatch(); } pst.executeBatch(); } catch (Exception e) { e.printStackTrace(); }
In diesem Code werden zwei ResultSets (rs und rs2) werden aus demselben Statement-Objekt (Anweisung) erstellt. Obwohl rs nicht explizit geschlossen wird, wird es implizit geschlossen, wenn die zweite Abfrage ausgeführt wird und rs2 abgerufen wird. Dies führt zu der Ausnahme, weil rs2 versucht, mit einem geschlossenen ResultSet zu arbeiten.
Lösung:
Um dieses Problem zu beheben, ist es wichtig, alle ResultSets vor der Verwendung zu schließen dasselbe Statement-Objekt, um neue ResultSets zu erhalten. Dies kann durch die Verwendung von try-finally-Blöcken erreicht werden, um sicherzustellen, dass das ResultSet auch dann geschlossen wird, wenn eine Ausnahme auftritt:
// Corrected code: closing the ResultSet objects try { // Execute the first query and obtain ResultSet rs ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;"); // Use rs to retrieve data if(rs.next()) { String name = rs.getString("name"); } // Close rs rs.close(); // Execute the second query and obtain ResultSet rs2 ResultSet rs2 = statement.executeQuery("SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";"); // Use rs2 to retrieve data while(rs2.next()) { int id = rs2.getInt("id"); int stuff = getStuff(id); pst.setInt(1, stuff); pst.addBatch(); } // Close rs2 rs2.close(); pst.executeBatch(); } catch (Exception e) { e.printStackTrace(); }
Das obige ist der detaillierte Inhalt vonWie löse ich eine Ausnahme „java.sql.SQLException: Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde' in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!