我目前正在分析在执行SQL选择时在我们的应用程序中发生的OutOfMemoryException。
环境:
- x86 .NET 4.6.1应用程序(不可能将其用作x64)
- Devart.Data 5.0.1491.0
- Devart.Data.Oracle 9.1.67.0
- 实体框架6.0.0.0
- Oracle 12c
会发生什么?
访问包含大量数据的多个表的特定查询会引发此异常。这只在使用应用程序一段时间后才会发生,首先它工作正常。一旦发生异常,此查询将始终失败;其他人工作。
例外来自:
类型的异常' System.OutOfMemoryException'被扔了。
堆栈跟踪:
at Devart.Data.Oracle.OracleDataReader.a()
at Devart.Data.Oracle.OracleDataReader.Read()
[...]
做的时候:
context.Database.SqlQuery<T>(query, allParameters.ToArray()).ToList()
context:是System.Data.Entity.DbContext
查询:我们自己计算的SQL查询(字符串)是什么
参数:包含1个参数,指定要返回的最大结果数
分析:
使用dotMemory对应用程序进行概要分析时,查询工作的时刻与不进行查询的时间之间并没有太大的区别。
工作:总共507MB,.NET使用76MB
不工作:535MB,.NET使用104MB
我们远离可用于.NET进程的2GB。
使用&#39; Oracle SQL Developer&#39;执行相同的查询时查询总是在〜30s
成功使用DbMonitor时,我们可以看到查询和回滚之间的延迟约为25秒(由于异常而完成)。查询和回滚都有错误&#39;已成功完成&#39;。
有人知道这个问题的原因甚至是可能的解决办法吗? DevArt可能会错误地抛出此异常,因为它例如达到超时?是否存在与.NET进程分离的内部缓存,该进程在一段时间后会被填充?
我首先在DevArt论坛上发布了这个问题,但没有得到答案。
提前感谢您的帮助。