ホームページ > データベース > mysql チュートリアル > Java でデータベース結果セットを安全に返し、リソース リークを回避するにはどうすればよいですか?

Java でデータベース結果セットを安全に返し、リソース リークを回避するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-29 02:24:09
オリジナル
422 人が閲覧しました

How Can I Safely Return Database Result Sets in Java and Avoid Resource Leaks?

ResultSet を安全に返す

データベース クエリから結果セットを返すことは、リソース リークのリスクがあるため、複雑なタスクになる可能性があります。ここでは、データを効率的に返す別のアプローチを検討することで、この課題に対処します。

問題:

結果セットを直接返そうとすると、コードはメソッドの実行後に結果セットが閉じられるため、java.sql.SQLException が発生します。

解決策: JavaBeans へのマッピング

結果セット自体を返す代わりに、データを 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;
}
ログイン後にコピー

Try-with-Resources ステートメント

Java 7 以降を使用している場合は、try-with-resources を利用できます。自動リソースクローズのステートメント:

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

    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;
}
ログイン後にコピー

追加考慮事項

接続、ステートメント、および結果セットをインスタンス変数として宣言しないようにすることが重要です (スレッドセーフの問題)。さらに、SQLException を適切に処理し、リソースを正しい順序で閉じることが重要です。これらのガイドラインに従うことで、リソース管理を維持しながら効果的に結果セットを返すことができます。

以上がJava でデータベース結果セットを安全に返し、リソース リークを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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