ホームページ > データベース > mysql チュートリアル > データベース クエリから直接 ResultSet を返すのはなぜ悪い考えなのでしょうか?

データベース クエリから直接 ResultSet を返すのはなぜ悪い考えなのでしょうか?

Mary-Kate Olsen
リリース: 2024-12-02 17:59:18
オリジナル
442 人が閲覧しました

Why is Returning a ResultSet Directly from a Database Query a Bad Idea?

ResultSet を返す

データベースを操作する場合、多くの場合、データを取得してアプリケーションで操作する必要があります。これを行う 1 つの方法は、データベースの結果へのアクセスを提供する ResultSet を使用することです。ただし、ResultSet を直接返すことには、特定の制限がある可能性があります。

制限について

提供されたコード内:

public ResultSet select() {
    ...
    return rs;
}
ログイン後にコピー
メソッドは、ResultSet 参照を返そうとします。ただし、このアプローチでは、ステートメントと接続を開いたままにし、早期のリリースを妨げるため、リソース リークの問題が発生する可能性があります。

代替アプローチ: JavaBeans へのマッピング

これらの制限を克服するには、より良いアプローチが必要です。 ResultSet を JavaBeans のコレクションにマップし、リストとして返すことができます。このメソッドにより、データベース リソースが適切に閉じられ、リソース リークが防止されます。

このアプローチを実装する改訂されたコードは次のとおりです。

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

    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;
}
ログイン後にコピー
この改訂されたメソッドは、Biler オブジェクトのリストを返します。これにより、ResultSet を直接返すことに伴うリソース漏洩の問題を気にすることなく、アプリケーションで操作できるようになります。

注目に値します。改善点

上記のアプローチに加えて、改訂されたコードには次のいくつかの改善点も含まれています。

    Connection、Statement、および ResultSet がインスタンス変数として宣言されていないため、潜在的なスレッドセーフ性が排除されています。
  • SQLException は飲み込まれるのではなくスローされるため、呼び出し元はそれらを次のように処理できます。
  • リソースは、例外が発生した場合でも適切なリソース管理を確保するために、finally ブロックで閉じられます。
これらのプラクティスを採用することで、データベースの対話がより堅牢になり、保守しやすくなります。 、そしてパフォーマンスも優れています。

以上がデータベース クエリから直接 ResultSet を返すのはなぜ悪い考えなのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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