Với cách tiếp cận của bạn, kết nối sẽ không bao giờ bị đóng nếu bất kỳ ngoại lệ nào được thực hiện trước đó conn.close()
được gọi là. Bạn cần lấy nó (và câu lệnh và bộ kết quả) trong một try
chặn và đóng nó trong finally
khối. Bất kỳ mã nào trong finally
sẽ luôn luôn được thực thi bất kể một ngoại lệ có được ném hay không. Với điều này, bạn có thể đảm bảo rằng các tài nguyên đắt tiền sẽ bị đóng.
Đây là một bài viết lại:
public int getSiteIdFromName(String name, String company) throws DataAccessException, java.sql.SQLException {
Connection conn = null;
Statement smt = null;
ResultSet rs = null;
int id = 0;
try {
conn = this.getSession().connection();
smt = conn.createStatement();
String query = "SELECT id FROM site WHERE name='" + name + "' and company_id='" + company + "'";
rs = smt.executeQuery(query);
rs.next();
id = rs.getInt("id");
} finally {
if (rs != null) try { rs.close(); } catch (SQLException logOrIgnore) {}
if (smt != null) try { smt.close(); } catch (SQLException logOrIgnore) {}
if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {}
}
return id;
}
Điều đó nói rằng, mã này nhạy cảm với chèn SQL
các cuộc tấn công
. Sử dụng PreparedStatement
thay vì Statement
.
Xem thêm :
- Hướng dẫn Sun Exceptions:Khối cuối cùng
- Hướng dẫn Sun JDBC:giới thiệu
- Hướng dẫn Sun JDBC:cách sử dụng PreparedStatement
- Hướng dẫn DAO:cách sử dụng mã JDBC cơ bản đúng cách