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 サイトの他の関連記事を参照してください。