Java: Fehler bei der Verwendung von ResultSet nach Verbindungsschließung
Beim Versuch, Daten aus einer MySQL-Datenbank mithilfe von JDBC abzurufen, kann bei Benutzern der folgende Fehler auftreten: „java.sql.SQLException: Vorgang nach dem Schließen von ResultSet nicht zulässig.“ Dies tritt auf, wenn versucht wird, ein ResultSet-Objekt zu verwenden, nachdem die zugrunde liegende Verbindung geschlossen wurde.
Erklärung
JDBC arbeitet nach einem Konzept des verzögerten Ladens, bei dem die Ergebnisse von a Die Abfrage wird erst dann vollständig abgerufen, wenn sie angefordert wird. Das ResultSet-Objekt stellt einen Cursor über den Ergebnissen bereit, sodass Sie diese durchlaufen können. Durch das Schließen der Verbindung, die das ResultSet erstellt hat, wird jedoch auch der Cursor geschlossen, wodurch er unbrauchbar wird.
Lösung
Um diesen Fehler zu vermeiden, muss man entweder die Verbindung bis zum nächsten Schritt offen halten Das ResultSet wird nicht mehr benötigt oder Sie verwenden einen anderen Ansatz.
Ein empfohlener Ansatz besteht darin, einen Zeilen-Mapper zu verwenden, um den Ergebnissatz in eine Sammlung von Objekten zu konvertieren. Diese Methode kapselt den Konvertierungsprozess und ermöglicht Ihnen den Zugriff auf die Ergebnisse auch nach dem Schließen der Verbindung:
<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>
Dieser modifizierte Code verwendet Try-with-Ressourcen, um sicherzustellen, dass die Verbindung, die Anweisung und die Ergebnismenge korrekt sind automatisch geschlossen, wenn die Methode abgeschlossen ist, sodass nicht vergessen wird, sie manuell zu schließen. Darüber hinaus wird eine Zeilenzuordnung verwendet, um jede Zeile im Ergebnissatz in ein ausgefülltes Objekt umzuwandeln, das dann in einer Liste gesammelt werden kann.
Fazit
Nach Verständnis Mit dem Lazy-Loading-Mechanismus von JDBC und der Verwendung von Row-Mappern können Entwickler effektiv Daten aus Datenbanken abrufen und gleichzeitig Fehler im Zusammenhang mit geschlossenen ResultSets nach dem Schließen der Verbindung vermeiden.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich in Java JDBC die Fehlermeldung „java.sql.SQLException: Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!