ホームページ > データベース > mysql チュートリアル > Java で「java.sql.SQLException: ResultSet が閉じられた後は操作は許可されません」例外を解決する方法は?

Java で「java.sql.SQLException: ResultSet が閉じられた後は操作は許可されません」例外を解決する方法は?

DDD
リリース: 2024-12-10 07:22:09
オリジナル
403 人が閲覧しました

How to Resolve a

操作は許可されていません: 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 サイトの他の関連記事を参照してください。

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