2009-07-01 44 views
12

Chúng tôi sử dụng Thư viện Enterprise 3.0 để truy cập vào Oracle DB (ứng dụng khách của Microsoft). Điều gì sẽ xảy ra khi tôi không vứt bỏ một cá thể DbCommand sau khi thủ tục hoặc hàm được lưu trữ được gọi? .NET có tự động thu gom rác không? Lưu ý rằng chúng tôi đảm bảo rằng giao dịch/kết nối bị đóng và xử lý đúng cách.Có cần phải vứt bỏ DbCommand sau khi sử dụng không?

Trả lời

17

Đây là một bản sao, nhưng tôi không có thời gian để tìm ra gốc.

Nếu nó triển khai IDisposable, và nếu bạn đã tạo nó, thì bạn cần phải gọi Dispose trên đó. Đó là lý do tại sao các nhà phát triển của lớp làm cho nó thực hiện IDisposable.

Bộ thu gom rác không gọi Dispose trên tất cả các đối tượng đang triển khai IDisposable.

+0

Cái gì? Không, đó là sai. Mẫu tiêu chuẩn cho Vứt bỏ là cho phép người dùng giải phóng tài nguyên sớm, nhưng vẫn dọn sạch trong finalizer nếu phương thức chưa được gọi. – RandomEngy

+0

Xem bài viết này: http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx Vứt bỏ() được gọi trong trình hoàn thiện, điều này thực sự sẽ chạy khi bộ thu gom rác đến được. – RandomEngy

+4

Không phải tất cả người dùng IDisposable đều thực hiện một finalizer. Không phải tất cả những người đàn áp một finalizer sẽ làm theo các mô hình tiêu chuẩn. Bạn không thể phụ thuộc vào sự tồn tại của một finalizer, một thứ bạn không thể phụ thuộc vào Dispose được gọi bởi bộ thu gom rác. –

1

Không chắc chắn 100% về Oracle, nhưng khi sử dụng SqlCommand, nó phải được xử lý sau khi sử dụng. Bạn có thể hoặc chỉ cần gọi .Dispose(), hoặc chỉ cần đặt nó trong một khối sử dụng, như vậy:


using(DbCommand cmd = new DbCommand(foo, bar)) 
{ 
    // use cmd object 
} 
7

Trình phản xạ không chỉ ra rằng OracleCommand ghi đè cụ thể Vứt bỏ (từ System.ComponentModel.Component thực hiện), vì vậy rất có thể sẽ không làm tổn thương ứng dụng của bạn nhiều nếu bạn không gọi nó.

Điều quan trọng, mặc dù, là OracleCommand thực hiện cụ thể IDbCommand, cụ thể triển khai IDisposable. Nếu bạn đã từng thay thế OracleCommand của mình bằng IDbCommand khác, thì bạn rất có thể muốn sử dụng Dispose(). Và trong khi SqlCommand không ghi đè rõ ràng Dispose(), Odbc và OleDb chắc chắn sẽ thực hiện.

Tóm lại, vì đó là IDisposable, bạn nên vứt bỏ nó, chỉ để ở bên an toàn.

+0

Cảm ơn bạn đã giải thích. – Vivek

4

Từ tài liệu cho IDisposable:

Việc sử dụng chính của giao diện này là để giải phóng các nguồn lực không được quản lý. Bộ thu gom rác tự động giải phóng bộ nhớ được cấp phát cho một đối tượng được quản lý khi đối tượng đó không còn được sử dụng nữa. Tuy nhiên, không thể dự đoán khi nào việc thu gom rác sẽ xảy ra. Hơn nữa, bộ thu gom rác không có kiến ​​thức về các tài nguyên không được quản lý như xử lý cửa sổ hoặc mở tệp và luồng.

Sử dụng phương pháp Vứt bỏ giao diện này để giải phóng tài nguyên không được quản lý một cách rõ ràng cùng với bộ thu gom rác. Người tiêu dùng của một đối tượng có thể gọi phương thức này khi đối tượng không còn cần thiết nữa.

Vì điều này, một đối tượng mà thực hiện IDisposable có khả năng duy trì tài liệu tham khảo để không được quản lý nguồn lực. Các tài nguyên này không được phát hành cho đến khi bộ thu gom rác đi cùng và thu thập đối tượng. Tuy nhiên, vì bạn không thể biết khi nào người thu gom rác sẽ làm điều này, các đối tượng dùng một lần (chẳng hạn như OracleDbCommand) có thể treo lâu hơn bạn có thể muốn.

Nếu một đối tượng thực hiện IDisposable, bạn nên gọi nó càng sớm càng tốt để giải phóng các nguồn lực không được quản lý mà nó giữ tham chiếu đến. Điều này có thể được thực hiện bằng cách gọi trực tiếp Dispose hoặc bằng cách khai báo nó trong một khối sử dụng.

+1

Tôi đọc điều đó để nói rằng "Hơn nữa, bộ thu gom rác không có kiến ​​thức về các tài nguyên không được quản lý như xử lý cửa sổ hoặc mở các tệp và luồng". Do đó, GC sẽ không phát hành các tài nguyên này, bao giờ hết. –

+1

Đó là lý do tại sao một lớp thực hiện IDisposable. GC không thể giải phóng chúng vì nó không biết về chúng.Lớp chứa các tài nguyên không được quản lý đó phải giải phóng chúng khi phương thức Dispose được gọi. –

+0

Nhưng bạn đã nói "Những tài nguyên này không được phát hành cho đến khi bộ thu gom rác đi cùng và thu thập đối tượng". Việc phát hành các tài nguyên không được quản lý này, nói chung, không phụ thuộc vào bộ thu gom rác. –

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