ResultSet
を渡さないでください 公的な方法で周り。ステートメントと接続を開いたままにする必要があるため、これはリソースリークを起こしやすいです。それらを閉じると、結果セットが暗黙的に閉じられます。ただし、それらを開いたままにしておくと、それらがぶらぶらして、開いているリソースが多すぎるとDBのリソースが不足する原因になります。
そのようにJavabeansのコレクションにマップし、代わりに返します:
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;
}
または、すでにJava 7を使用している場合は、を使用してください。 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;
}
ちなみに、Connection
を宣言するべきではありません 、Statement
およびResultSet
インスタンス変数として(スレッドセーフの大きな問題です!)、SQLException
を飲み込むこともありません。 その時点では(呼び出し元には問題が発生したという手がかりはありません)、同じtry
でリソースを閉じることもありません。 (たとえば、結果セットcloseが例外をスローした場合、ステートメントと接続はまだ開いています)。これらの問題はすべて、上記のコードスニペットで修正されています。