Du bör aldrig skicka ett ResultSet
runt genom offentliga metoder. Detta är benäget att resursläcka eftersom du är tvungen att hålla uttalandet och anslutningen öppna. Att stänga dem skulle implicit stänga resultatuppsättningen. Men att hålla dem öppna skulle få dem att dingla runt och få DB att ta slut på resurser när det finns för många av dem öppna.
Mappa den till en samling Javabeans som så och returnera den istället:
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;
}
Eller, om du redan använder Java 7, använd bara prova-med-resurser uttalande som automatiskt stänger dessa resurser:
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;
}
Förresten, du bör inte deklarera Connection
, Statement
och ResultSet
som instansvariabler alls (stort trådsäkerhetsproblem!), inte heller svälja SQLException
vid den tidpunkten alls (uppringaren kommer inte att ha någon aning om att ett problem uppstod), och inte heller stänga resurserna i samma try
(om t.ex. resultatuppsättningen nära ger ett undantag, är satsen och anslutningen fortfarande öppna). Alla dessa problem åtgärdas i ovanstående kodavsnitt.