操作は許可されていません: Java での ResultSet クローズ例外
特定の SQL クエリを実行すると、開発者は「java.sql.SQLException:」が発生する可能性があります。 ResultSet が閉じられた後は操作は許可されません」という例外が発生しました。このエラーは通常、同じ Statement オブジェクトから複数の ResultSet を同時に試行したときに発生します。
この問題を示す次のコード スニペットを考えてみましょう。
// 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(); }
このコードでは、2 つの ResultSet (rs とrs2) は、同じ Statement オブジェクト (ステートメント) から作成されます。ただし、rs は明示的に閉じられていませんが、2 番目のクエリが実行されて rs2 が取得されたときに暗黙的に閉じられます。 rs2 は閉じられた ResultSet を操作しようとしているため、例外が発生します。
解決策:
この問題を解決するには、使用する前にすべての ResultSet を閉じることが重要です。同じ Statement オブジェクトを使用して新しい ResultSet を取得します。これは、try-finally ブロックを使用して、例外が発生した場合でも ResultSet が確実に閉じられるようにすることで実現できます。
// 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(); }
以上がJava で「java.sql.SQLException: ResultSet が閉じられた後は操作は許可されません」例外を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。