Никога не трябва да предавате ResultSet
наоколо чрез публични методи. Това е предразположено към изтичане на ресурси, защото сте принудени да държите изявлението и връзката отворени. Затварянето им би имплицитно затворило набора от резултати. Но запазването им отворени би ги накарало да се мотаят наоколо и да доведе до изчерпване на ресурсите на БД, когато има твърде много от тях отворени.
Съпоставете го с колекция от 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, просто използвайте опитайте с ресурси оператор, който автоматично ще затвори тези ресурси:
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 хвърля изключение, тогава операторът и връзката са все още отворени). Всички тези проблеми са коригирани в горните кодови фрагменти.