2011-11-24 31 views
14

Về cơ bản tôi đã (bỏ qua xử lý ngoại lệ, vv):Tôi có thể đóng các câu lệnh trong một giao dịch trước khi thực hiện nó trong Derby (JDBC) không?

connection.setAutoCommit(false); 

Statement statement1 = connection.createStatement(); 
statement1.executeUpdate("..."); 
statement1.close(); 

Statement statement2 = connection.createStatement(); 
statement2.executeUpdate("..."); 
statement2.close(); 

connection.commit(); 

Nếu tôi hiểu đúng nó không nên có bất kỳ tác động bởi vì tất cả nó thực sự là miễn phí các nguồn lực cho GC. Especially with Derby: Bạn nên đóng rõ ràng Câu lệnh, Kết quả và Kết nối khi bạn không cần đến chúng nữa. Các kết nối đến Derby là các tài nguyên bên ngoài một ứng dụng và trình thu gom rác sẽ không tự động đóng chúng.

Tuy nhiên điều này có gây ra bất kỳ sự cố nào với giao dịch không? Tôi không tin giao dịch dựa trên Bảng sao kê. Bất cứ ai có thể vui lòng xác nhận điều này?

+0

Dường như, nếu bạn đóng một Tuyên bố, _transaction_ vẫn đang mở ở phía DB (chờ cam kết hoặc khôi phục). Nó chỉ kết thúc/đóng khi một lệnh cam kết hoặc rollback được cấp cho kết nối. Tôi có đúng không? – ADTC

Trả lời

15

Tuyệt đối, bạn có thể đóng chúng và bạn nên làm như vậy.

+2

+1 cho "nên" –

+0

Tôi đồng ý. Nhưng nó có thể TRƯỚC KHI giao dịch đã chấm dứt hay nó phải sau khi giao dịch đã hoàn tất? –

6

Nói chung, sau khi thực hiện Statement, cơ sở dữ liệu/cơ sở dữ liệu bên dưới chịu trách nhiệm đảm bảo thực hiện thành công. Bất kỳ lỗi nào được mong đợi sẽ dẫn đến việc SQLException được đưa vào trong các lời gọi Statement.executeXXX. Và bất kỳ việc thực hiện thành công nào cũng sẽ dẫn đến việc cơ sở dữ liệu theo dõi các cập nhật này trong một khu vực làm việc tạm thời. Cam kết giao dịch chỉ đảm bảo rằng các cập nhật gây ra bởi các báo cáo được ghi vào một cửa hàng lâu bền, từ khu vực làm việc tạm thời. Đây thường là trường hợp trong hầu hết/tất cả các cơ sở dữ liệu.

Do đó, an toàn khi đóng đối tượng Statement khi bạn không còn cần đến nó nữa mà không gặp phải bất kỳ tác dụng phụ nào trong giao dịch.

0

Tất nhiên là an toàn để đóng báo cáo trước khi thực hiện giao dịch. Bạn cần phải đọc - Closing Statement object prior to committing từ coderanch và JDBC Transactions tutorial.

+2

Tôi đã làm, cả trên thực tế. Các bình luận Java Ranch bắt đầu với "Tôi tin" mà không phải là xác nhận, và không ai tiếp tục nó, cuộc thảo luận đã đi trên một ốp. Hướng dẫn JDBC đóng các câu lệnh trong khối cuối cùng, sau cam kết. Và không có đề cập đến những gì sẽ xảy ra nếu bạn đóng Báo cáo trước đó. Vì vậy, hãy cẩn thận trong ý kiến ​​của bạn, nó không rõ ràng, cũng không phải là nó được nêu trong một trong những tài liệu tham khảo ... –

1

Yup. Đó là một thực hành tốt và cách tiếp cận để đóng báo cáo trước khi cam kết các giao dịch.

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