2016-07-11 8 views
0

Ich habe einen Webjob, der eine lang laufende gespeicherte Prozedur aufruft, die das Timing aushält. Kann mir bitte jemand helfen?Azure - WebJob Timeout beim Aufruf der Stored Procedure

Der Web-Job wird mit dem folgenden Code aufgerufen:

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

     context.Database.CommandTimeout = 6000; 

     context.PopulateJobTypeDescendants(); 

    } 

Das Verfahren nach Kontext (ApplicationDbContext), unten gezeigt wird:

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

Die folgende Ausnahme wird ausgelöst, wenn der Web-Job Lauf. Wir haben gelesen, dass es mit den Plan/DTUs auf dem Server in Verbindung gebracht werden könnte, also gingen wir von S1 -> S3, dies behob das Problem immer noch nicht und der Prozess bombardierte nach 45 Sekunden. Die seltsame Sache ist, dass, wenn ich Verbindung zu azur SQL-db von SSMS und rufen Sie die gespeicherte Prozedur funktioniert es gut.

[2016.07.11 22.25.02> e2cf50: ERR] Unbehandelte Ausnahme: System.Data.SqlClient.SqlException: Timeout abgelaufen. Die Zeitüberschreitung Zeitraum vor Abschluss der Operation abgelaufen oder der Server reagiert nicht auf . Dieser Fehler ist bei dem Versuch aufgetreten, eine Verbindung mit dem Routingziel herzustellen. Die Dauer beim Versuch, eine Verbindung zum ursprünglichen Server herzustellen, war - [Voranmeldung] Initialisierung = 14; Handshake = 26; [Login] Initialisierung = 0; Authentifizierung = 0; [Post-Login] abgeschlossen = 1; ---> System.ComponentModel.Win32Exception: Das Warten Operation timed out

Die Verbindungszeichenfolge ist unten dargestellt:

<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" /> 

Antwort

0

der Tat sieht es wie ein Performance-Problem. Könnten Sie bitte antworten Sie mir offline bei mihaelab bei Micrososft dot com mit Server, Datenbanknamen Details und vollständige Aufrufliste der Ausnahme?

Danke, Mihaela

0

Es ist möglich, dass dies durch einige Inkonsistenzen in EF, wie pflanzt den Wert CommandTimeout auf die Befehle seiner erzeugt verursacht wird, z.B. Datenbankinitialisierung durchführen oder Versionsinformationen vom Server beziehen.

Es sollte möglich sein Kommando Abfangen als Behelfslösung zu verwenden, z.B .:

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); 
     } 
    } 
} 

ich einen Fehler bei https://github.com/aspnet/EntityFramework6/issues/24 erstellt haben, dies zu verfolgen.