Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menyelesaikan Pengecualian 'java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup' dalam Java?

Bagaimana untuk Menyelesaikan Pengecualian 'java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup' dalam Java?

DDD
Lepaskan: 2024-12-10 07:22:09
asal
407 orang telah melayarinya

How to Resolve a

Operasi Tidak Dibenarkan: ResultSet Closed Exception dalam Java

Apabila melaksanakan pertanyaan SQL tertentu, pembangun mungkin menghadapi "java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup". Ralat ini biasanya berlaku apabila berbilang ResultSets dicuba secara serentak daripada objek Pernyataan yang sama.

Pertimbangkan coretan kod berikut yang menunjukkan isu ini:

// Problem code: using the same statement object to create multiple ResultSets

try {
    // Execute the first query and obtain ResultSet rs
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;");

    // Execute the second query and obtain ResultSet rs2
    ResultSet rs2 = statement.executeQuery("SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";");

    // Prepare a new statement and attempt to use rs2
    PreparedStatement pst = (PreparedStatement)connection.prepareStatement("INSERT INTO `blah`............");

    // Process data from rs2 and update the database using pst
    while(rs2.next()) {
        int id = rs2.getInt("id");
        int stuff = getStuff(id);

        pst.setInt(1, stuff);
        pst.addBatch();
    }

    pst.executeBatch();
} catch (Exception e) {
    e.printStackTrace();
}
Salin selepas log masuk

Dalam kod ini, dua ResultSets (rs dan rs2) dicipta daripada objek Pernyataan yang sama (penyataan). Walau bagaimanapun, walaupun rs tidak ditutup secara eksplisit, ia ditutup secara tersirat apabila pertanyaan kedua dilaksanakan dan rs2 diperolehi. Ini menghasilkan pengecualian kerana rs2 cuba untuk beroperasi pada ResultSet tertutup.

Resolusi:

Untuk menyelesaikan isu ini, adalah penting untuk menutup semua ResultSets sebelum menggunakan objek Pernyataan yang sama untuk mendapatkan ResultSets baharu. Ini boleh dicapai dengan menggunakan blok try-finally untuk memastikan ResultSet ditutup walaupun pengecualian berlaku:

// Corrected code: closing the ResultSet objects
try {
    // Execute the first query and obtain ResultSet rs
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;");

    // Use rs to retrieve data
    if(rs.next()) {
        String name = rs.getString("name");
    }

    // Close rs
    rs.close();

    // Execute the second query and obtain ResultSet rs2
    ResultSet rs2 = statement.executeQuery("SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";");

    // Use rs2 to retrieve data
    while(rs2.next()) {
        int id = rs2.getInt("id");
        int stuff = getStuff(id);

        pst.setInt(1, stuff);
        pst.addBatch();
    }

    // Close rs2
    rs2.close();

    pst.executeBatch();
} catch (Exception e) {
    e.printStackTrace();
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Pengecualian 'java.sql.SQLException: Operasi tidak dibenarkan selepas ResultSet ditutup' dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan