Rumah > Artikel > pangkalan data > Mengapa kod Java saya membuang ralat \"Operation Not Allowed After ResultSet Closed\" apabila menggunakan JDBC?
JDBC ResultSet Ralat: "Operasi Tidak Dibenarkan Selepas ResultSet Ditutup"
Di Java, menggunakan JDBC untuk menyambung ke pangkalan data dan melaksanakan pertanyaan melalui ResultSet boleh membawa kepada ralat jika sambungan ditutup lebih awal.
Punca:
JDBC ResultSet bukanlah perwakilan lengkap hasil pertanyaan. Sebaliknya, ia menyediakan sambungan langsung ke pangkalan data, membolehkan anda mengambil hasil baris demi baris. Jika sambungan ditutup, ResultSet kehilangan sambungannya dan menjadi tidak sah.
Mesej Ralat:
java.sql.SQLException: Operation not allowed after ResultSet closed
Sampel Kod:
Kod berikut menunjukkan ralat:
<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>
Dalam kod ini, ralat berlaku kerana rs masih digunakan di luar blok akhirnya, walaupun selepas sambungan ditutup.
Penyelesaian:
Untuk mengelakkan ralat ini, anda harus mengisi objek atau koleksi sementara berdasarkan ResultSet dalam skop sambungan pangkalan data. Setelah sambungan ditutup, objek atau koleksi sementara boleh dipulangkan atau digunakan tanpa sebarang isu.
Kod Tersusun Semula:
<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>
Atas ialah kandungan terperinci Mengapa kod Java saya membuang ralat \"Operation Not Allowed After ResultSet Closed\" apabila menggunakan JDBC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!