2012-12-24 35 views
18

Tôi biết mẫu an toàn trong Java là đóng ResultSet, Statement và Connection của bạn theo thứ tự trong một khối cuối cùng.Việc đóng kết nối có tự động đóng lệnh và kết quả không?

Nếu bạn đóng kết nối và sau đó cố gắng đóng tuyên bố (không ném ngoại lệ). Nhưng nếu bạn cố gắng gọi bất kỳ phương thức nào từ câu lệnh thì một ngoại lệ được ném ra.

Tôi tự hỏi việc đóng kết nối có tự động đóng tất cả các đối tượng câu lệnh được tạo ra từ kết nối đó không?

Cập nhật:
Tôi đang sử dụng DatabaseProductVersion: Oracle Database 11g Release 11.1.0.0.0
DriverName: Oracle trình điều khiển JDBC
DriverVersion: 10.2.0.4.0

+2

http://stackoverflow.com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separately-although-the-connection –

Trả lời

14

Có, Connection.close API cho biết "Phát hành cơ sở dữ liệu của đối tượng kết nối và tài nguyên JDBC ngay lập tức thay vì đợi chúng tự động được phát hành". Vấn đề là các ứng dụng thường sử dụng các pool kết nối cơ sở dữ liệu và chúng có thể đơn giản trả về kết nối tới pool trên Connection.close.

Trong mọi trường hợp, bạn nên luôn luôn đóng ResultSet và Statement một cách tường minh và không dựa vào Connection.close.

Bên cạnh đó, không phải là ý tưởng tốt nhất để làm việc trực tiếp với JDBC. Bạn có thể sử dụng Spring JDBC thay vào đó và quên đi việc giải phóng vấn đề tài nguyên.

+2

Một hồ bơi kết nối tốt bằng văn bản phải đóng các tài nguyên cơ bản có liên quan (khác so với kết nối chính nó) khi kết nối được đóng lại. Mã khách hàng được viết tốt không nên phụ thuộc vào điều đó. Trong thực tế, hầu hết mọi thứ đều được viết kém và thực hành tốt cho mã của bạn để có mùi hoa hồng. –

+1

Phải. Tôi quyết định thử nghiệm nó với BasicDataSource của Apache: Tôi đã mở conn, tạo ra stmt, conn khép kín và chạy truy vấn. Got SQLException "[email protected]" được đóng lại. " –

+0

" không phải là ý tưởng tốt nhất để làm việc với JDBC trực tiếp ". Tại sao không? Mùa xuân có thể hữu ích trong một số trường hợp, nhưng ở những người khác chỉ tạo ra chi phí không cần thiết. –

2

Các chi tiết có cuối cùng xuống mỗi JDBC thực hiện trình điều khiển; tuy nhiên, một khi kết nối đến cơ sở dữ liệu bị đóng, mọi thứ liên quan đến nó được xử lý ở phía DB, vì vậy không có gì nhiều phía máy khách có thể làm nhưng tự động đóng các đối tượng đại diện cho các tài nguyên này.

Bạn không bao giờ biết những cách nào mà các trình điều khiển/dữ liệu có thể bị hỏng (ví dụ: có thể có rò rỉ tài nguyên), do đó đề xuất thực hành tốt nhất là đóng mọi thứ một cách rõ ràng.

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