Nikdy byste neměli předat ResultSet
prostřednictvím veřejných metod. To je náchylné k úniku prostředků, protože jste nuceni ponechat prohlášení a připojení otevřené. Jejich uzavření by implicitně uzavřelo sadu výsledků. Ale jejich ponechání otevřené by způsobilo, že by se povalovaly a v DB by došly zdroje, když jich je otevřených příliš mnoho.
Namapujte jej na kolekci podobných Javabeanů a místo toho jej vraťte:
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;
}
Nebo, pokud již používáte Java 7, použijte try-with-resources příkaz, který tyto zdroje automaticky zavře:
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;
}
Mimochodem, neměli byste deklarovat Connection
, Statement
a ResultSet
jako proměnné instance vůbec (hlavní problém bezpečnosti vláken!), ani spolknout SQLException
v tom okamžiku vůbec (volající nebude mít tušení, že došlo k problému), ani nebude zavírat zdroje ve stejném try
(pokud např. zavřít sadu výsledků vyvolá výjimku, příkaz a připojení jsou stále otevřené). Všechny tyto problémy jsou opraveny ve výše uvedených fragmentech kódu.