OutOfMemoryException SQL Select

OutOfMemoryException with SQL Select

我目前正在分析我们的应用程序在执行 SQL select 时发生的 OutOfMemoryException。

环境:
- x86 .NET 4.6.1 应用程序(无法将其用作 x64)
- Devart.Data 5.0.1491.0
- Devart.Data.Oracle 9.1.67.0
- Entity Framework 6.0.0.0
-甲骨文 12c

会发生什么?
访问包含大量数据的多个表的特定查询会引发此异常。这只会在使用该应用程序一段时间后发生,首先它运行良好。一旦异常发生,这个查询总是失败;其他人虽然工作。

异常来自:
抛出类型 'System.OutOfMemoryException' 的异常。 堆栈跟踪:

at Devart.Data.Oracle.OracleDataReader.a() 
at Devart.Data.Oracle.OracleDataReader.Read()
[...]

做的时候:

context.Database.SqlQuery<T>(query, allParameters.ToArray()).ToList()

上下文:是 System.Data.Entity.DbContext
查询:是我们自己计算的 SQL 查询(字符串)
参数:包含 1 个参数,指定要重新运行的最大结果数

分析:
使用 dotMemory 分析应用程序时,查询有效和无效之间没有太大区别。
工作:总共 507MB,.NET 使用了 76MB
不工作:535MB,.NET 使用 104MB
我们离 .NET 进程可用的 2GB 还很远。

当使用 'Oracle SQL Developer' 执行相同的查询时,查询总是在 ~30 秒后成功

使用 DbMonitor 时,我们可以看到查询和回滚之间有约 25 秒的延迟(由于异常而完成)。查询和回滚都有一个 Error 'Completed successfully'.

有人知道这个问题的原因甚至可能的解决方法吗? DevArt 是否会错误地抛出此异常,因为它例如到达超时?是否存在与 .NET 进程分离的内部缓存,该缓存会在一段时间后被填充?

我首先在 DevArt 论坛上发布了这个问题,但没有得到答案。

在此先感谢您的帮助。

按照您的 OracleCommand here as first option, try setting the FetchSize 属性 的建议明确设置为合理的值(如 100)。

I had found this post before but I haven't been able to set the FetchSize (even after investigating for 2h now). We don't instantiate the OracleCommand ourselves; it is being done when executing the query.

使用 connection string 指定值并以 非常低 开始以确定是否是原因。