Rumah >pangkalan data >tutorial mysql >Mengapa Saya Mendapat \'java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup\' Apabila Menggunakan JDBC?

Mengapa Saya Mendapat \'java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup\' Apabila Menggunakan JDBC?

DDD
DDDasal
2024-10-29 14:07:02927semak imbas

Why Am I Getting

Java - Tidak Dapat Menggunakan ResultSet Selepas Sambungan Ditutup

Masalah:

Percubaan untuk laksanakan pertanyaan pangkalan data menggunakan JDBC menghasilkan ralat berikut:

java.sql.SQLException: Operation not allowed after ResultSet closed

Analisis:

JDBC menggunakan objek ResultSet untuk mendapatkan semula data daripada pertanyaan. Walau bagaimanapun, apabila sambungan ke pangkalan data ditutup, objek ResultSet menjadi tidak sah dan tidak boleh digunakan lagi.

Penyelesaian:

Untuk menyelesaikan isu ini, elakkan lulus objek ResultSet di luar kaedah yang melaksanakan pertanyaan. Sebaliknya, gunakan ResultSet untuk mengisi objek atau senarai dan mengembalikan objek yang terhasil itu.

Contoh Kod dengan Populasi Objek:

<code class="java">public static Collection<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);
    Collection<T> collection = new ArrayList<>();
    while (rs.next()) {
        collection.add(rowMapper.mapRow(rs));
    }
    // Close resources even if exceptions are thrown
    closeGracefully(rs, st, connection);
    return collection;
}</code>

Menutup Sumber Dengan Anggun :

<code class="java">private static void closeGracefully(ResultSet rs, Statement st, Connection connection) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (st != null) {
        try {
            st.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
}</code>

Pertimbangan Tambahan:

  • Gunakan pemeta baris untuk mencipta objek daripada setiap baris ResultSet.
  • Parameterkan pertanyaan untuk mengelakkan serangan suntikan SQL.
  • Pertimbangkan untuk menggunakan perpustakaan pihak ketiga seperti JDBC atau Spring JDBC untuk akses pangkalan data yang dipermudahkan.

Atas ialah kandungan terperinci Mengapa Saya Mendapat \'java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup\' 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