2012-05-09 33 views
5

Javadoc nói cho .close() của PreparedStatement nói rằng nó ..Mối quan hệ giữa "đóng" đối với Chuẩn bị và Kết nối?

phiên bản cơ sở dữ liệu bản Tuyên Bố này của đối tượng và các nguồn lực JDBC ngay lập tức thay vì chờ đợi điều này xảy ra khi nó sẽ tự động đóng lại. Thông thường, thực tiễn tốt là giải phóng tài nguyên ngay sau khi bạn kết thúc với chúng để tránh bị ràng buộc tài nguyên cơ sở dữ liệu .

Gọi phương thức đóng trên đối tượng Statement đã bị đóng không có hiệu lực.

Lưu ý: Khi đối tượng Statement được đóng, đối tượng ResultSet hiện tại của nó, nếu có, cũng bị đóng.

Xem xét kịch bản sau đây

MyConnector databaseConnector = DBManager.instance().getConnector(); 

    Connection con = databaseConnector.getConnection(); // returns java.sql.Connection 
    PreparedStatement pstmt = null; 

    try { 
     pstmt = con.prepareStatement("some query"); 
     ... 
    } finally { 
     if (pstmt != null) 
      pstmt.close(); 
    } 

Trong ví dụ này, sẽ pstmt.close() cũng gần con?

+0

No. Đóng một tuyên bố sẽ * không * đóng kết nối (vì có thể có * nhiều * câu lệnh cho một kết nối). Kết nối cũng * cũng * được coi là tài nguyên được quản lý. –

+2

Bạn luôn có thể kiểm tra yoursef này, với "con.isClosed()" http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html –

Trả lời

9

Đóng một Statementkhông đóng một Connection. Tuy nhiên, đóng một số Connectionsẽ đóng một Statement.

Hãy suy nghĩ về nó như vậy:

  • Connection -> tạo ra và tự động đóng -> Bản Tuyên Bố
  • Trữ -> tạo ra và tự động đóng -> ResultSet

Vì vậy, đóng cửa một Connection sẽ tự động đóng bất kỳ số nào Statement s bất kỳ số nào ResultSet.

Tuy nhiên, vẫn được coi là thực tiễn tốt nhất để đóng tất cả ba thủ công (ResultSet theo sau là Statement, sau đó là Connection) nếu có thể.

2

Lưu ý: Khi một Tuyên bố đối tượng được đóng lại, hiện nay ResultSet [nhưng không kết nối] đối tượng, nếu có, cũng đóng cửa.

Nó sẽ không đóng kết nối, nó chỉ đóng đối tượng resultset.

0

Nếu bạn đang sử dụng Java 7 và try-with-resources bạn không cần phải lo lắng về việc đóng kết nối hoặc bất kỳ các Statement hoặc ResultSet.

try (Connection conn = databaseConnector.getConnection(); 
    PreparedStatement pstmt = conn.prepareStatement("some query")) { 
    ... 
} catch (Exception e) { 
    ... 
} 
+0

Điểm tốt.Thật không may tôi vẫn còn trên 1,6 (bây giờ) – JAM

Các vấn đề liên quan