【问题标题】:OutOfMemoryException with SQL Select带有 SQL 选择的 OutOfMemoryException
【发布时间】: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


【解决方案1】:

按照建议将here 作为第一个选项,尝试将OracleCommandFetchSize 属性显式设置为合理的值(例如100)。

我以前找到过这篇文章,但我无法设置 FetchSize(即使现在调查了 2 小时)。我们不实例化 OracleCommand我们自己;执行时正在执行 查询。

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

【讨论】:

  • 我之前发现过这篇文章,但我无法设置 FetchSize(即使现在调查了 2 小时)。我们不会自己实例化“OracleCommand”;它是在执行查询时完成的。我希望在这里找到默认属性devart.com/dotconnect/oracle/docs/EFProviderConfiguration.html,但没有。你知道怎么配置吗?
  • 不能在connection string中指定吗?
  • 您的连接字符串是正确的,非常感谢!第一次测试表明,将值增加到 1000 可以解决问题(我暂时无法重现它);将其降低到 50 仍会引发异常(默认值为 100)。我现在必须进一步调查以了解影响(乍一看,为什么增加提取大小会减少使用的内存对我来说没有意义)并分析以了解执行时间如何受到影响。
猜你喜欢
  • 1970-01-01
  • 2014-06-06
  • 2013-01-28
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2021-10-10
相关资源
最近更新 更多