ホームページ > データベース > mysql チュートリアル > Java でステートメント接続を再利用すると「ResultSet が閉じられた後は操作が許可されません」が発生するのはなぜですか?

Java でステートメント接続を再利用すると「ResultSet が閉じられた後は操作が許可されません」が発生するのはなぜですか?

DDD
リリース: 2024-12-16 17:44:12
オリジナル
655 人が閲覧しました

Why Does

ステートメント接続を再利用する前に ResultSet を閉じる

Java データベース プログラミングでは、閉じた後に準備されたステートメントを使用すると例外が発生することがあります。結果セット。この例外「ResultSet を閉じた後は操作は許可されません」は、特に同じ接続オブジェクトが使用されている場合に発生します。

指定されたコード スニペットでは、既存の ResultSet を閉じた後、同じ接続オブジェクトを使用して新しい準備済みステートメントが作成されます。 (rs および rs2)。これにより例外が発生します。この問題を解決してステートメント接続を再利用するには、最初にステートメントに関連付けられた以前のすべての ResultSet が閉じられていることを確認することをお勧めします。

推奨されるアプローチの 1 つは、ResultSet を自動的に閉じる try-with-resources ブロックを使用することです。およびステートメント。以下に例を示します。

try (
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;")
) {
    if (rs.next()) {
        // Process the results
    }

    try (
        ResultSet rs2 = statement.executeQuery("SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";")
    ) {
        String updateSql = "INSERT INTO `blah` ...";
        PreparedStatement pst = (PreparedStatement) connection.prepareStatement(updateSql);

        while (rs2.next()) {
            // ...
        }

        pst.executeBatch();
    }
} catch (SQLException e) {
    e.printStackTrace();
}
ログイン後にコピー

この例では、新しいバッチを準備するためにステートメントを使用しようとする前に、rs と rs2 の両方がそれぞれの try ブロック内で閉じられます。これにより、準備されたステートメントを実行する前に、開いている ResultSet が存在しないことが保証されます。

データベースとの正しい対話には、アクティブな ResultSet オブジェクトを維持することが重要であることを覚えておいてください。例外を回避し、データの整合性を確保するために、適切なリソースの処理とクリーンアップを常に優先してください。

以上がJava でステートメント接続を再利用すると「ResultSet が閉じられた後は操作が許可されません」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート