ホームページ >データベース >mysql チュートリアル >Java JDBC MySQL で「ResultSet が閉じられた後は操作が許可されません」を回避するにはどうすればよいですか?

Java JDBC MySQL で「ResultSet が閉じられた後は操作が許可されません」を回避するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 11:20:11417ブラウズ

How to Avoid

Java JDBC MySQL 接続での ResultSet のクローズの処理

Java JDBC を使用して MySQL データベースを操作する場合、ResultSet のクローズを適切に管理することが重要です。 「ResultSet を閉じた後は操作は許可されません。」というエラーを回避するには。このエラーは、閉じた ResultSet に対して操作を実行しようとすると発生し、予期しない動作や誤ったクエリ結果が発生します。

問題の理解

提供されたコードでは、例外は、MySQLDonation クラスの while (results.next()) ループ内でトリガーされます。実際の原因は、同じ Statement オブジェクト (ステートメント) が SELECT クエリ (寄付を取得するため) と後続の DELETE クエリ (処理された寄付レコードを削除するため) の両方に使用されていることです。

解決策:クエリごとに新しい Statement を作成する

この問題を解決するには、クエリを実行するたびに新しい Statement オブジェクトを作成する必要があります。これにより、前の ResultSet が後続のクエリ実行によって自動的に閉じられなくなります。 MySQLDatabase クラスの変更点は次のとおりです。

public ResultSet query(String query) throws SQLException {
    Statement statement = connection.createStatement();
    if (query.toLowerCase().startsWith("select")) {
        return statement.executeQuery(query);
    } else {
        statement.executeUpdate(query);
    }
    statement.close(); // Optional: May not be necessary as Resources are auto-closed
    return null;
}

追加の考慮事項

Statement オブジェクトの管理に加えて、メモリの消費を防ぐために JDBC リソースを処理するためのベスト プラクティスに従うことが重要です。リークを防止し、適切なデータベース接続処理を保証します。以下に追加のヒントをいくつか示します。

  • 自動リソース管理には try-with-resources ブロックを使用します。
  • Statement、ResultSet、および ResultSet を初期化して閉じます。 try-catch ブロック内の接続オブジェクト。
  • ハンドル例外を適切に処理し、例外が存在する場合でもリソースを解放します。

結論

クエリごとに新しいステートメントを作成し、リソース管理を遵守することによってベスト プラクティスを実行すると、「ResultSet が閉じられた後は操作は許可されません」エラーを回避し、MySQL クエリを正しく実行できるようになります。効率と信頼性を高めるために、データベースの対話を継続的に最適化することを忘れないでください。

以上がJava JDBC MySQL で「ResultSet が閉じられた後は操作が許可されません」を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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