【发布时间】:2017-08-03 04:00:04
【问题描述】:
我目前正在分析我们的应用程序在执行 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
- 甲骨文 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 秒(由于异常而完成)。查询和回滚都有一个错误“成功完成”。
有人知道这个问题的原因甚至可能的解决方法吗? DevArt 是否会错误地抛出此异常,因为它例如达到超时?是否有一个与 .NET 进程分离的内部缓存,它会在一段时间后被填充?
我首先在 DevArt 论坛上发布了这个问题,但没有得到答案。
提前感谢您的帮助。
【问题讨论】:
标签: c# .net oracle entity-framework-6 devart