Entity framework 调用Oracle.DataAccess.dll方法时内存泄漏

Entity framework 调用Oracle.DataAccess.dll方法时内存泄漏,entity-framework,oracle11g,dispose,odp.net,clob,Entity Framework,Oracle11g,Dispose,Odp.net,Clob,我们有一个WCF web服务,它使用实体框架作为数据访问的ORM。 我们使用的oracle数据库是oracle database 11g Enterprise Edition 11.2.0.1.0-64位生产版。 实体框架使用Oracle.DataAccess.dll连接到数据库。使用的Oracle.DataAccess版本为2.112.3.0。 我们在调用Oracle数据库时出现内存泄漏。 经调查,, 挂起转储显示OraOCIEI11上有4.35%到8.33%的线程被阻塞!slgtd()调用。

我们有一个WCF web服务,它使用实体框架作为数据访问的ORM。 我们使用的oracle数据库是oracle database 11g Enterprise Edition 11.2.0.1.0-64位生产版。 实体框架使用Oracle.DataAccess.dll连接到数据库。使用的Oracle.DataAccess版本为2.112.3.0。 我们在调用Oracle数据库时出现内存泄漏。 经调查,, 挂起转储显示OraOCIEI11上有4.35%到8.33%的线程被阻塞!slgtd()调用。 2.20%的线程由于泄漏的临界段而被阻塞(拥有临界段的线程是处理OraOps11w!ssmem_free()调用的线程)。正在等待的电话有: Oracle.DataAccess.Client.OpsDac.Dispose() Oracle.DataAccess.Client.OpsDac.Read() 我们想知道是否需要等待Oracoi11函数的调用

另外,我们还有另一个处于锁定状态的关键部分,拥有该部分的线程正在处理oracle调用Oraciei11!slgtd()。 我们看到Oracle.DataAccess.Client.OracleDataReader.Read()方法在从数据库检索Clob数据时需要花费时间

而且, Oracle.DataAccess.Client.OracleDataReader.Dispose调用OraOps11w!尚未返回的ssmem_free()。在使用EF的CompiledQuery功能后,实体框架将在内部调用此方法

此问题是否与我们正在使用的dll版本有关? 有什么方法可以避免泄漏的关键部分和内存泄漏? 如有任何建议,将不胜感激

问候,,
Manish

当您使用ODP.NET 12.1时,问题是否消失了?还要确保对连接对象调用Close()和Dispose()。垃圾收集器不会知道连接对象控制的资源比它控制的多。您是否使用OracleTimeStamp/DateTimeOffset列?否。我们没有使用OracleTimeStamp。我们已将代码更改为在读取器上显式调用Close()和Dispose()方法,命令和连接以及Clobtype上的命令和连接。@ChristianShay:我无法更改我们项目的ODP.Net版本。