ホームページ >データベース >mysql チュートリアル >JDBC で「ResultSet が閉じられた後は操作が許可されません」が発生する理由とその修正方法

JDBC で「ResultSet が閉じられた後は操作が許可されません」が発生する理由とその修正方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-26 16:32:10248ブラウズ

Why Does

MySQL Result Set が閉じた後は操作は許可されません

JDBC を使用してデータベースと対話する場合、ResultSet オブジェクトを慎重に扱うことが重要です。 「ResultSet を閉じた後は操作は許可されません」のような例外を避けてください。このエラーは、すでに閉じられている ResultSet に対して操作を実行しようとすると発生します。

例外について

例外は、ResultSet を反復処理しようとするとスローされます。 ResultSet は閉じられた後に next() メソッドを使用します。これは、ResultSet を閉じると内部カーソルを含むリソースが解放され、それ以降の操作が無効になるために発生します。

結果セットが閉じられる原因

  • 明示的な呼び出しResultSet
  • の close() メソッド 同じ Statement に対するクエリの再実行オブジェクト
  • Statement オブジェクトを使用して複数の ResultSet を作成します

提供されたコードの解決策

提供されたコード内のエラーは、 MySQLDonation クラスを使用して寄付テーブルを循環します。 SELECT クエリから取得された ResultSet は、後続の DELETE クエリに対して Statement が再実行されるときに閉じられます。

この問題を解決するには、クエリの実行と結果処理のステップを分離します。

// In MySQLDatabase class
private void handleDonation(Client client, int creditamount) {
    try (Statement statement = getConnection().createStatement()) {
        // Execute DELETE query with new Statement
        statement.executeUpdate(String.format("DELETE ..."));
    }
}

クエリごとに新しい Statement を作成すると、クエリが実行されるまで ResultSet が開いたままになります。完了しました。

追加メモ

  • ステートメントと結果セットを自動的に閉じるために、try-with-resources ブロックの使用を検討してください。
  • 必要な場合は、複数の ResultSet を反復するには、異なる Statement オブジェクトで実行します。
  • 詳細については、JDBC ドキュメントを参照してください。 ResultSet の処理に関するベスト プラクティス。

以上がJDBC で「ResultSet が閉じられた後は操作が許可されません」が発生する理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。