我们使用Enterprise Library 3.0来访问Oracle DB(microsoft oracle客户端).在调用存储过程或函数后不处理DbCommand实例时会发生什么?.NET会自动垃圾收集吗?请注意,我们确保事务/连接已关闭并正确处理.
Joh*_*ers 19
这是重复的,但我没有时间找到原件.
如果它实现了IDisposable,并且如果你创建了它,那么你需要在它上面调用Dispose.这就是为什么该类的开发人员使它实现IDisposable.
垃圾收集器不会对所有IDisposable实现对象调用Dispose.
Reflector并没有表明OracleCommand具体覆盖Dispose(System.ComponentModel.Component无论如何都是来自实现),所以如果你不调用它,它很可能不会对你的应用程序造成太大影响.
但重要的是OracleCommand具体实现IDbCommand,具体实现IDisposable.如果您曾经替换OracleCommand过另一个IDbCommand,那么您很可能想要使用Dispose().虽然SqlCommand没有明确覆盖Dispose(),但Odbc和OleDb肯定会这样做.
简而言之,因为它是IDisposable,你应该处理它,只是为了安全起见.
从文档中IDisposable:
此接口的主要用途是释放非托管资源。当某个对象不再使用时,垃圾收集器会自动释放分配给该对象的内存。但是,无法预测垃圾收集何时发生。此外,垃圾收集器不了解非托管资源,例如窗口句柄或打开的文件和流。
使用此接口的 Dispose 方法与垃圾收集器一起显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。
鉴于此,实现的对象IDisposable可能维护对非托管资源的引用。在垃圾收集器出现并收集对象之前,不会释放这些资源。但是,由于您不知道垃圾收集器何时会执行此操作,因此一次性对象(例如OracleDbCommand)可能会比您希望它们停留的时间长得多。
如果一个对象实现了IDisposable,你应该尽快调用它来释放它持有引用的非托管资源。这可以通过Dispose直接调用或在 using 块中声明来实现。
| 归档时间: |
|
| 查看次数: |
11039 次 |
| 最近记录: |