【问题标题】:EF6 executing a long running stored procedure gets timeout errorsEF6 执行长时间运行的存储过程会出现超时错误
【发布时间】:2013-11-25 23:50:54
【问题描述】:

我最近将我的项目从 EF5 升级到了 EF6。在这个项目中,我有一个定期运行的 Azure Worker Role,它在 SQL Azure 上启动一个存储过程,更新一堆数据库信息,平均需要 1.5 小时才能执行。完成后,辅助角色使用存储过程的返回结果执行附加任务。

这曾经在 EF5 中完美运行,但在 EF6 中每次都失败并出现以下错误之一:

错误 从服务器接收结果时发生传输级错误。 (提供者:Session Provider,错误:19 - 物理连接不可用)

错误会话已被终止,因为它获得了太多的锁。尝试在单个事务中读取或修改更少的行。当前命令发生严重错误。结果(如果有)应丢弃。

我尝试了以下方法来修复错误:

  1. 已验证所有存储过程读取都具有WITH (NOLOCK) 修饰符
  2. 将实体框架上下文的超时时间增加到 5 小时
  3. 删除了新的SqlAzureExecutionStrategy 并恢复使用DefaultExecutionStrategy
  4. 删除了存储过程中发生的所有事务
  5. 确保辅助角色中的此步骤在其自己的上下文中运行

代码示例:

using (var dbContext = new EFEntityContext())
{
    // set the timeout to 5 hours
    var objectContext = (dbContext as IObjectContextAdapter).ObjectContext;
    objectContext.CommandTimeout = 18000; // 5 hours

    // update all active curriculums
    var result = dbContext.usp_MyLongRunningProd();

    // log the results of the operation
    Trace.TraceInformation(result);
}

此外,存储过程将一个大表读入游标,循环遍历它,并根据每个项目执行分析和数据更改。我不需要光标处于任何类型的事务中,也没有使用我知道的,除非 EF 正在制作一个,这就是问题所在。

【问题讨论】:

    标签: entity-framework azure-sql-database entity-framework-6


    【解决方案1】:

    我相信这篇文章可能会给出答案,但我要等到今晚的工作开始后才能知道。如果成功,我会更新这个答案:

    http://entityframework.codeplex.com/discussions/454994

    上面写着:

    作为连接弹性工作的一部分,我们更改了默认设置 某些可能产生副作用的 API 的行为开始使用 交易。我们还介绍了一种选择退出此新功能的方法 不交易的特定情况下的行为 支持的。例如,您可以在新的重载中 Database.ExecuteSqlCommand 传递一个新的枚举参数来禁用 交易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多