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

Java で「ResultSet が閉じられた後は操作は許可されません」例外を処理する方法?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 14:21:02848ブラウズ

How to Handle

Java - 「ResultSet クローズ後の操作は許可されていません」例外の処理

MySQL 接続を閉じるときに、「操作が許可されていません」というエラーが発生する場合があります。 ResultSet が閉じられた後は許可されます。」これは、JDBC がクエリ結果を段階的に取得し、接続が閉じると無効になる ResultSet を提供するために発生します。

例外の原因

返される ResultSetあなたのメソッドはオープン接続に依存しています。 Finally ブロック内で接続を閉じると、ResultSet が使用できなくなり、例外が発生します。

Solution

ResultSet を返す代わりに、次のメソッドを作成します。オブジェクトまたはオブジェクトのコレクションを設定します。次に、設定されたオブジェクトまたはコレクションを返します。

リファクタリングされたコード

次のコードは、メソッドの変更されたバージョンを示しています。

<code class="java">public static List<T> sqlquery(String query, RowMapper<T> rowMapper) throws SQLException {
    Connection connection = DriverManager.getConnection("databaseadress", "username", "password");
    Statement st = connection.createStatement();
    ResultSet rs = st.executeQuery(query);
    List<T> list = new ArrayList<>();
    while (rs.next()) {
        list.add(rowMapper.mapRow(rs));
    }
    try {
        rs.close();
        st.close();
        connection.close();
    } catch (SQLException e) {
        log.info(e);
    }
    return list;
}</code>

RowMapper の使用

RowMapper インターフェイスは、ResultSet の各行をオブジェクトにマップするために使用されます。設定したいオブジェクトに基づいて RowMapper の独自の実装を作成できます。

利点

このアプローチにより、次のことが可能になります。

  • 接続とは独立した再利用可能なオブジェクトを返します。
  • ResultSet またはステートメントのクローズ中にスローされた例外が接続のクローズを妨げるのを防ぎます。
  • SQL インジェクションを防ぐためにクエリのパラメータ化を容易にします。

結論

「ResultSet が閉じられた後は操作は許可されません」例外を回避するには、RowMapper を使用してオブジェクトまたはコレクションを設定し、ResultSet の代わりにそれらを返すようにコードを変更します。このアプローチにより、接続が閉じられた後もメソッドが機能し続けることが保証されます。

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

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