我们有一个WCF Web服务,它使用Entity Framework作为ORM进行数据访问。 我们使用的oracle数据库是Oracle Database 11g企业版11.2.0.1.0版 - 64位生产版。 实体框架使用Oracle.DataAccess.dll连接到数据库。使用的Oracle.DataAccess版本是2.112.3.0。 在调用Oracle数据库时,我们遇到内存泄漏。 在调查中, 挂起转储显示在OraOCIEI11!slgtd()调用中阻止了4.35%到8.33%的线程。 2.20%的线程由于泄漏的临界区而被阻塞(拥有临界区的线程是处理OraOps11w!ssmem_free()调用的线程)。正在等待的电话是: Oracle.DataAccess.Client.OpsDac.Dispose() Oracle.DataAccess.Client.OpsDac.Read() 我们想知道是否需要等待OraOCIEI11功能的呼叫?
我们还有另一个处于锁定状态的关键部分,拥有处理oracle调用OraOCIEI11!slgtd()的拥有线程。 我们看到Oracle.DataAccess.Client.OracleDataReader.Read()方法在从数据库中检索Clob数据时花费了一些时间。
另外, Oracle.DataAccess.Client.OracleDataReader.Dispose调用尚未返回的OraOps11w!ssmem_free()。在使用EF的CompiledQuery Feature之后,实体框架在内部调用此方法。
此问题是否与我们使用的dll版本有关? 我们可以尝试任何方法来避免泄漏的关键部分和内存泄漏吗? 任何建议将不胜感激。
此致 和Manish