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

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

Barbara Streisand
リリース: 2024-11-27 03:09:10
オリジナル
584 人が閲覧しました

How to Avoid `java.sql.SQLException: Operation not allowed after ResultSet closed` in Java?

ResultSet を返す

データベースをクエリする場合、返された結果を効果的に処理する必要があります。データベースにクエリを実行するメソッドから ResultSet を返そうとするときに、一般的な問題が 1 つ発生します。ただし、ResultSet を直接返すと、リソース リークや不適切なリソース管理が発生する可能性があります。

エラー「java.sql.SQLException: ResultSet が閉じられた後は操作は許可されません」は、メソッドが実行される前に ResultSet オブジェクトが閉じられていることを示します。返してください。これを解決するには、ResultSet を Javabean のコレクションにマップし、代わりにそれを返すことをお勧めします。このアプローチにより、ResultSet は使用後に自動的に閉じられ、リソース リークが防止されます。

ResultSet を Javabean のリストにマップする方法の例を以下に示します。

public List<Biler> list() throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Biler> bilers = new ArrayList<Biler>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return bilers;
}
ログイン後にコピー
この例ではたとえば、 list() メソッドはデータベースにクエリを実行し、結果を Biler オブジェクトのリストにマップして、そのリストを返します。これにより、ResultSet が適切に閉じられ、リソース リークが防止されます。

もう 1 つの方法は、try-with-resources ステートメントを使用することです。これにより、コード ブロックが完了するとリソースが自動的に閉じられます。

public List<Biler> list() throws SQLException {
    List<Biler> bilers = new ArrayList<Biler>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    }

    return bilers;
}
ログイン後にコピー
これらの推奨事項に従うことで、開発者は ResultSet が適切に処理され、リソース リークを防ぎ、Java アプリケーションでの効率的なデータベース アクセスを保証できます。

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

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