使用SQL Select的OutOfMemoryException

时间:2017-03-13 07:38:09

标签: c# .net oracle entity-framework-6 devart

我目前正在分析在执行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论坛上发布了这个问题,但没有得到答案。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

根据建议here作为第一个选项,请尝试将OracleCommand的{​​{3}}属性明确设置为合理的值(如100)。

  

之前我发现过这篇文章,但是我还没有设置好   FetchSize(即使现在调查了2小时后)。我们没有实例化   OracleCommand我们自己;它是在执行时执行的   查询。

使用FetchSize指定值,并以极低开始,以确定是否是原因。