Anda tidak boleh melewatkan ResultSet
sekitar melalui metode publik. Ini rentan terhadap kebocoran sumber daya karena Anda terpaksa menjaga pernyataan dan koneksi tetap terbuka. Menutupnya secara implisit akan menutup set hasil. Tetapi membiarkannya tetap terbuka akan menyebabkannya menggantung dan menyebabkan DB kehabisan sumber daya jika terlalu banyak yang dibuka.
Petakan ke kumpulan Javabeans seperti itu dan kembalikan sebagai gantinya:
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;
}
Atau, jika Anda sudah menggunakan Java 7, gunakan saja coba-dengan-sumber daya pernyataan yang akan menutup sumber daya tersebut secara otomatis:
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;
}
Omong-omong, Anda tidak boleh mendeklarasikan Connection
, Statement
dan ResultSet
sebagai variabel instan sama sekali (masalah keamanan utas utama!), atau menelan SQLException
pada saat itu sama sekali (penelepon tidak akan tahu bahwa terjadi masalah), atau menutup sumber daya dalam try
yang sama (jika misalnya result set close melempar pengecualian, maka pernyataan dan koneksi masih terbuka). Semua masalah tersebut diperbaiki dalam cuplikan kode di atas.