Heim > Datenbank > MySQL-Tutorial > Wie löse ich eine Ausnahme „java.sql.SQLException: Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde' in Java?

Wie löse ich eine Ausnahme „java.sql.SQLException: Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde' in Java?

DDD
Freigeben: 2024-12-10 07:22:09
Original
407 Leute haben es durchsucht

How to Resolve a

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();
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage