Bạn không bao giờ được vượt qua ResultSet
xung quanh thông qua các phương pháp công khai. Điều này dễ bị rò rỉ tài nguyên vì bạn buộc phải giữ câu lệnh và kết nối mở. Việc đóng chúng sẽ hoàn toàn đóng tập kết quả. Nhưng giữ chúng ở trạng thái mở sẽ khiến chúng lơ lửng và khiến DB cạn kiệt tài nguyên khi có quá nhiều tài nguyên đang mở.
Ánh xạ nó với một bộ sưu tập Javabeans như vậy và trả lại nó thay thế:
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;
}
Hoặc, nếu bạn đã sử dụng Java 7, chỉ cần sử dụng thử với tài nguyên câu lệnh sẽ tự động đóng các tài nguyên đó:
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;
}
Nhân tiện, bạn không nên khai báo Connection
, Statement
và ResultSet
dưới dạng các biến phiên bản (vấn đề an toàn chuỗi chính!), cũng như không nuốt SQLException
tại thời điểm đó (người gọi sẽ không có manh mối nào cho thấy sự cố đã xảy ra), cũng như không đóng các tài nguyên trong cùng một try
(nếu ví dụ:tập kết quả đóng ném một ngoại lệ, thì câu lệnh và kết nối vẫn mở). Tất cả những vấn đề đó đã được khắc phục trong các đoạn mã trên.