Rumah >pangkalan data >tutorial mysql >Mengapa kod Java saya membuang ralat \'Operation Not Allowed After ResultSet Closed\' apabila menggunakan JDBC?

Mengapa kod Java saya membuang ralat \'Operation Not Allowed After ResultSet Closed\' apabila menggunakan JDBC?

Barbara Streisand
Barbara Streisandasal
2024-11-02 03:56:03362semak imbas

Why does my Java code throw a

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn