GetOracleDecimal内存泄漏@GilShalit一年前评论说:“嗯,在与GetOracleDecimal(我们提供给客户的代码)中的内存泄漏作斗争一年多之后,我们开始不信任ODP(.Net2.0)...祝你好运!”——GilShalit09年8月27日在12:44你是如何修复它的?我们有一项服务,每隔几分钟查询一次Oracle数据库而不释放内存;在使用WinDbg进行一些调查后,我发现这种类型堆积在终结队列中:Oracle.DataAccess.Types.OpoDecCtx。这是我认为问题的范围:十进制体积=(decimal)OracleDecimal.SetPrecision(reader.GetOracleDecimal(5),28);我对此发表了评论,内存泄漏消失了。任何想法将不胜感激-谢谢!这是ODP.NET的一个老问题(参见此处:ODP.NET10.1.0.4的内存问题)。OracleDecimal类型包含OpoDecCtx到名为OpoDecCtx的内部类的实例。OpoDecCtx实现了IDisposable(因为它本身引用了非托管内存),但是由于OracleDecimal没有实现IDisposable,您必须等待垃圾收集器运行以释放底层的非托管内存。您可以使用.NETReflector等工具检查所有这些。虽然从技术上讲,这不是“物理”内存泄漏(内存最终会被释放),但当您处理大量OracleDecimal类型的实例时,这实际上是一个问题。我不知道为什么Oracle不简单地实现IDisposable,这是一件简单的事情......无论如何,我建议你自己做一些黑客攻击,使用反射:publicstaticclassOracleExtentions{publicstaticvoidDispose(thisOracleDecimalod)//构建一个扩展方法{if(OracleDecimalOpoDecCtx==null){//缓存数据//获取底层内部字段信息}IDisposabledisposable=OracleDecimalOpoDecCtx.GetValue(od)作为IDisposable;if(disposable!=null){disposable.Dispose();}}privatestaticFieldInfoOracleDecimalOpoDecCtx;您可以像这样使用它:OracleDecimalod=reader.GetOracleDecimal(5);十进制体积=(十进制)OracleDecimal.SetPrecision(od,28);od.Dispose();我不知道是否可以从ODP.NET更改为另一个提供商,但我们很久以前就通过放弃ODP问题解决了这个问题......并且正在使用第3方(商业)ADO.NET提供商(非附属)...看这个链接http://www.devart.com/dotconnect/oracle/docs/以上是C#学习教程:GetOracleDecimalmemoryleaksharing的全部内容,如果对你有用你需要知道更多关于C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
