JDBC ResultSet-Fehler: „Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde“
In Java wird JDBC verwendet, um eine Verbindung zu einer Datenbank herzustellen und Abfragen auszuführen Ein ResultSet kann zu Fehlern führen, wenn die Verbindung vorzeitig geschlossen wird.
Ursache:
Das JDBC ResultSet ist keine vollständige Darstellung der Abfrageergebnisse. Stattdessen stellt es eine Live-Verbindung zur Datenbank bereit, sodass Sie Ergebnisse Zeile für Zeile abrufen können. Wenn die Verbindung geschlossen wird, verliert das ResultSet seine Verbindung und wird ungültig.
Fehlermeldung:
java.sql.SQLException: Operation not allowed after ResultSet closed
Codebeispiel:
Der folgende Code veranschaulicht den Fehler:
<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>
In diesem Code tritt der Fehler auf, weil rs immer noch außerhalb des „finally“-Blocks verwendet wird, auch nachdem die Verbindung geschlossen wurde.
Lösung:
Um diesen Fehler zu vermeiden, sollten Sie ein transientes Objekt oder eine Sammlung basierend auf dem ResultSet innerhalb des Datenbankverbindungsbereichs füllen. Sobald die Verbindung geschlossen ist, kann das transiente Objekt oder die transiente Sammlung problemlos zurückgegeben oder verwendet werden.
Umstrukturierter Code:
<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>
Das obige ist der detaillierte Inhalt vonWarum gibt mein Java-Code bei der Verwendung von JDBC den Fehler „Vorgang nicht zulässig, nachdem ResultSet geschlossen wurde“ aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!