ホームページ > データベース > mysql チュートリアル > Java JDBC で「java.sql.SQLException: ResultSet が閉じられた後は操作が許可されません」が発生するのはなぜですか?

Java JDBC で「java.sql.SQLException: ResultSet が閉じられた後は操作が許可されません」が発生するのはなぜですか?

Linda Hamilton
リリース: 2024-10-29 19:01:02
オリジナル
781 人が閲覧しました

Why Am I Getting

Java: 接続終了後の ResultSet 使用時のエラー

JDBC を使用して MySQL データベースからデータを取得しようとすると、次のエラーが発生する場合があります。 「java.sql.SQLException: ResultSet が閉じられた後は操作は許可されません。」これは、基礎となる接続が閉じられた後に ResultSet オブジェクトを使用しようとすると発生します。

説明

JDBC は遅延読み込みの概念に基づいて動作します。クエリは要求されるまで完全には取得されません。 ResultSet オブジェクトは結果の上にカーソルを提供し、結果を反復処理できるようにします。ただし、ResultSet を作成した接続を閉じるとカーソルも閉じられ、カーソルが使用できなくなります。

解決策

このエラーを回避するには、次のいずれかの方法で接続を開いておく必要があります。 ResultSet は不要になったか、別のアプローチを使用してください。

推奨されるアプローチの 1 つは、行マッパーを使用して結果セットをオブジェクトのコレクションに変換することです。このメソッドは変換プロセスをカプセル化し、接続が閉じられた後でも結果にアクセスできるようにします。

<code class="java">public static List<T> sqlquery(String query, RowMapper<T> rowMapper) throws SQLException {
    try (Connection connection = DriverManager.getConnection(...);
         Statement st = connection.createStatement();
         ResultSet rs = st.executeQuery(query)) {
        List<T> list = new ArrayList<>();
        while (rs.next()) {
            list.add(rowMapper.mapRow(rs));
        }
        return list;
    }
}</code>
ログイン後にコピー

この変更されたコードは、try-with-resources を使用して、接続、ステートメント、および結果セットが確実にメソッドが完了すると自動的に閉じられるため、手動で閉じ忘れる可能性が排除されます。さらに、行マッパーを使用して、結果セット内の各行をデータが取り込まれたオブジェクトに変換し、リストに収集できます。

結論

JDBC の遅延読み込みメカニズムと行マッパーを利用することで、開発者は、接続が閉じられた後に閉じられた ResultSet に関連するエラーを回避しながら、データベースからデータを効果的に取得できます。

以上がJava JDBC で「java.sql.SQLException: ResultSet が閉じられた後は操作が許可されません」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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