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(); }
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(); }
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!