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
Đâ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.
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
}
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.
Cảm ơn bạn đã giải thích. – Vivek
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.
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. –
Đó 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. –
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. –
- 1. Vứt bỏ mẫu sau khi đóng
- 2. Tôi có cần Vứt bỏ() hoặc Đóng() một EventWaitHandle không?
- 3. Tôi có cần phải vứt bỏ bối cảnh đồ họa được trả về từ Component.getGraphics() không?
- 4. Tôi có phải vứt bỏ Process.Start (url) không?
- 5. C# sql gì cần vứt bỏ
- 6. Giữ một MemoryMappedFile Alive sau khi vứt bỏ
- 7. DbContext vứt bỏ sau khi yêu cầu đầu tiên khi sử dụng InRequestScope Ninject của()
- 8. Các vấn đề sau khi vứt bỏ DbContext
- 9. Khi nào cần vứt bỏ System.Threading.Task với nhiệm vụ con?
- 10. Tôi có nên vứt bỏ Mutex không?
- 11. Có cần thiết để sử dụng Process.WaitForExit sau khi Process.Kill?
- 12. Vứt bỏ một HtmlControl
- 13. Kiểm tra mã cho biết tôi cần phải vứt bỏ vật thể. Cái nào?
- 14. Tôi có cần phải bỏ/đóng XDocument.Load (chuỗi) không?
- 15. Khi sử dụng lợi nhuận trong câu lệnh "đang sử dụng", khi nào Vứt bỏ xảy ra?
- 16. Tôi có nên vứt bỏ một BinaryReader nếu tôi cần bảo quản luồng "được bao bọc"?
- 17. thông số Copy từ DbCommand khác DbCommand
- 18. IEnumerator: Phương pháp Vứt bỏ trống có bình thường không?
- 19. Tại sao bạn phải vứt bỏ() một java.awt.Window không nằm trong phạm vi?
- 20. XPathDocument có sử dụng luồng bộ nhớ được xây dựng sau khi xây dựng không?
- 21. Liệu System.Runtime.Caching.MemoryCache có vứt bỏ các mục IDisposable khi bị đuổi không?
- 22. SqlCommandBuilder.GetUpdateCommand() có cần phải được gọi trước khi sử dụng SqlDataAdpater.Update() không?
- 23. Tháo các bộ xử lý khi vứt bỏ vật thể
- 24. Có cần phải đọc Dữ liệu cốt lõi trong performBlock khi sử dụng NSMainQueueConcurrencyType không?
- 25. Vứt bỏ/Đóng ExchangeService trong C#?
- 26. Chúng ta có cần bao gồm bình thường hóa sau khi sử dụng Pure css không?
- 27. Chờ() cần thiết sau khi sử dụng Task.Factory.StartNew()?
- 28. Tôi có cần gọi MessageDigest.reset() trước khi sử dụng không?
- 29. Vứt bỏ một thành phần không khi một biểu mẫu được xử lý?
- 30. C# Vứt bỏ trừu tượng phương pháp
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
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
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. –