2016-07-11 126 views
0

我有一个webjob调用长时间运行的存储过程,以保持超时。任何人都可以帮忙吗?Azure - 调用存储过程时的WebJob超时

腹板作业用下面的代码称为:

static void Main() 
    { 
     ApplicationDbContext context = new ApplicationDbContext(); 

     context.Database.CommandTimeout = 6000; 

     context.PopulateJobTypeDescendants(); 

    } 

上下文(ApplicationDbContext)的方法如下所示:

public void PopulateJobTypeDescendants() 
    { 
     Database.ExecuteSqlCommand("PopulateJobTypeDescendants"); 
    } 

以下引发异常当web作业是跑。我们已经读过,它可能与服务器上的计划/ DTU有关,所以我们从S1 - > S3,但仍然没有解决问题,并且过程在45秒后爆炸。奇怪的是,如果我从SSMS连接到azure sql db并调用存储过程,它可以正常工作。

[2016年7月11日22时25分02秒> e2cf50:ERR]未处理的异常: System.Data.SqlClient.SqlException:超时过期。在操作完成之前已经过去的时间段为 ,或者服务器为 未响应。尝试连接到路由目标的 时发生此故障。尝试连接到原始服务器的 花费的持续时间为 - [Pre-Login] initialization = 14; handshake = 26; [登录]初始化= 0;认证= 0; [登录后] complete = 1; ---> System.ComponentModel.Win32Exception:等待 操作超时

连接字符串如下所示:

<add name="TempsContext" connectionString="Server=tcp:[XXX],1433;Database=temps_testing;User ID=[XXX];Password=[XXX];Trusted_Connection=False;Encrypt=True;Connection Timeout=600;" providerName="System.Data.SqlClient" /> 

回答

0

事实上,它看起来像一个性能问题。请问您可以在mihaelab的microsft dot com下使用服务器,数据库名称详细信息和完整的异常调用堆栈离线回复我?

谢谢, 米哈埃拉

0

这是可能的,这是通过一些不一致EF如何传播的CommandTimeout值到它的创建命令,例如引起做数据库初始化或从服务器获取版本信息。

应该可以使用命令拦截作为一种解决方法,例如:

using System.Data.Common; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure.Interception; 

namespace CommandTimeOutBug 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DbInterception.Add(new MyInterceptor()); 

      using (var context = new ApplicationDbContext()) 
      { 

       context.Database.CommandTimeout = 6000; 

       context.PopulateJobTypeDescendants(); 
      } 
     } 
    } 

    public class ApplicationDbContext : DbContext 
    { 

     public void PopulateJobTypeDescendants() 
     { 
      Database.ExecuteSqlCommand("PopulateJobTypeDescendants"); 
     } 
    } 

    public class MyInterceptor: DbCommandInterceptor 
    { 

     public override void NonQueryExecuting(DbCommand command, 
      DbCommandInterceptionContext<int> interceptionContext) 
     { 
      command.CommandTimeout = 6000; 
      base.NonQueryExecuting(command, interceptionContext); 
     } 

     public override void ReaderExecuting(DbCommand command, 
      DbCommandInterceptionContext<DbDataReader> interceptionContext) 
     { 
      command.CommandTimeout = 6000; 
      base.ReaderExecuting(command, interceptionContext); 
     } 

     public override void ScalarExecuting(DbCommand command, 
      DbCommandInterceptionContext<object> interceptionContext) 
     { 
      command.CommandTimeout = 6000; 
      base.ScalarExecuting(command, interceptionContext); 
     } 
    } 
} 

我创建了一个错误,在https://github.com/aspnet/EntityFramework6/issues/24跟踪此。