Hành vi của resultsets và (đã chuẩn bị) báo cáo được ghi rõ trong Java API. Tôi đề nghị bạn đọc tài liệu thực tế (và đặc tả JDBC) để có được các chi tiết.
Các Statement
API nói:
Theo mặc định, chỉ có một đối tượng ResultSet
mỗi Statement
đối tượng có thể được mở cùng một lúc. Do đó, nếu việc đọc một đối tượng ResultSet
được xen kẽ với việc đọc một đối tượng khác, mỗi đối tượng phải được tạo bởi các đối tượng khác nhau Statement
. Tất cả các phương thức thực thi trong giao diện Statement
hoàn toàn đóng đối tượng ResultSet
hiện tại của một thống kê nếu một đối tượng mở đang tồn tại.
(nhấn mạnh mỏ).
Trong mã cụ thể của bạn, khi bạn gọi aStmt.executeQuery()
, số ResultSet
cũ được gán cho aRset
sẽ được trình điều khiển đóng hoàn toàn. Điều đó nói rằng, nó sẽ là tốt hơn để đóng một cách rõ ràng cho mình (hoặc sử dụng Java 7 thử-với-nguồn lực), để ngăn chặn bạn quên để đóng các ResultSet
trong vòng lặp cuối cùng thông qua vòng lặp.
Bây giờ đến PreparedStatement
: Khi bạn chuẩn bị một câu lệnh (nói chung, việc triển khai có thể khác nhau), truy vấn được gửi đến máy chủ để biên dịch.Khi thực hiện các tham số cho việc thực thi cụ thể đó được gửi đến máy chủ. Gọi close()
trên aStmt
sẽ dẫn đến tuyên bố chuẩn bị được deallocated trên máy chủ, rõ ràng là NOT những gì bạn muốn ở đây vì bạn muốn sử dụng lại tuyên bố với các giá trị khác nhau cho tham số của nó.
Vì vậy, trong ngắn
- Đóng
ResultSet
không phải là về mặt kỹ thuật cần thiết ở đây (trừ trường hợp cuối cùng ResultSet
tạo), nhưng nó là tốt hơn để làm điều đó một cách rõ ràng
- Bạn chỉ nên đóng
PreparedStatement
khi bạn đang thực hiện với nó.
Sử dụng try-with-resources là một cách để loại bỏ một phần của sự nhầm lẫn về những vấn đề, như mã của bạn sẽ tự động nhả nguồn khi nó được thực hiện với nó (ở phần cuối của phạm vi sử dụng):
try (
ResultSet cRset = cStmt.executeQuery(cQuery);
PreparedStatement aStmt = aConn.prepareStatement(aQuery);
) {
while (cRset.next()) {
//stuff to determine value of parm1
aStmt.setString(1, parm1);
try (ResultSet aRset = aStmt.executeQuery()) {
//more stuff
}
}
}
Ở cuối đoạn mã này tất cả các tài nguyên JDBC được đóng đúng (theo thứ tự đúng, ngay cả khi ngoại lệ xảy ra, vv)
Nguồn
2013-07-12 07:37:48
Thực ra, đối với ResultSet cuối cùng được tạo (tất cả các tài nguyên không được khai báo khác), tôi có một phương thức để đóng mọi thứ ở cuối chương trình. Xem xét điều đó, liệu tôi có nên rời khỏi logic của tôi không? – heisenbergman
@heisenbergman Bạn nên đóng tài nguyên ngay khi bạn không còn cần đến chúng nữa. Việc để chúng mở có thể làm tăng mức sử dụng bộ nhớ trong cả ứng dụng và cơ sở dữ liệu của bạn. –