Du bør aldrig videregive et ResultSet
rundt gennem offentlige metoder. Dette er tilbøjeligt til ressourcelækage, fordi du er tvunget til at holde erklæringen og forbindelsen åbne. At lukke dem ville implicit lukke resultatsættet. Men at holde dem åbne ville få dem til at dingle rundt og få databasen til at løbe tør for ressourcer, når der er for mange af dem åbne.
Tilknyt det til en samling af Javabeans som sådan og returner det i stedet:
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, hvis du allerede er på Java 7, skal du bare bruge prøv-med-ressourcer erklæring, som automatisk lukker disse ressourcer:
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;
}
I øvrigt bør du ikke erklære Connection
, Statement
og ResultSet
som instansvariable overhovedet (større trådsikkerhedsproblem!), og heller ikke sluge SQLException
på det tidspunkt overhovedet (den, der ringer, har ingen anelse om, at der opstod et problem), og lukker heller ikke ressourcerne i samme try
(hvis f.eks. resultatsæt lukke afgiver en undtagelse, så er sætning og forbindelse stadig åbne). Alle disse problemer er løst i ovenstående kodestykker.