2013-03-08 14 views
5

Ich habe den folgenden Code für die Handhabung von INSERT/UPDATE Wiederholungslogik mit exponentiellen Backoff beim Schreiben in eine Azure-Datenbank implementiert.SQL Azure Datenbank Wiederholungslogik

static SqlConnection TryOpen(this SqlConnection connection) 
{ 
    int attempts = 0; 
    while (attempts < 5) 
    { 
    try 
    { 
     if (attempts > 0) 
     System.Threading.Thread.Sleep(((int)Math.Pow(3, attempts)) * 1000); 
     connection.Open(); 
     return connection; 
    } 
    catch { } 
    attempts++; 
    } 
    throw new Exception("Unable to obtain a connection to SQL Server or SQL Azure."); 
} 

Aber sollte ich in Erwägung ziehen, Wiederholungslogik auch für meine Datenbanklesevorgänge anzuwenden? Oder würde die Methode SqlCommand.CommandTimeout() ausreichen? Die meisten meiner liest werden mit dem folgenden Code eingeführt:

Dim myDateAdapter As New SqlDataAdapter(mySqlCommand) 
Dim ds As New DataSet 
myDateAdapter.Fill(ds, "dtName") 

Es ist schwer zu wissen, welche Art von transienten Fehlern in einer Produktionsumgebung mit Azure auftreten wird so jetzt versuche ich, so viel Milderung wie möglich zu tun.

Antwort

5

Ich denke, dass Wiederholungen Teil Ihrer Windows Azure SQL-Datenbankoperationen im Allgemeinen sein werden.

Anstatt eine benutzerdefinierte Lösung zu implementieren, haben Sie die transient fault handling application block von Microsoft Patterns and Practices speziell für SQL-Datenbank veröffentlicht?

+0

Ich untersuche das jetzt. Bietet der TFH-Block detaillierte Informationen darüber, warum eine Verbindung unterbrochen wird? – QFDev

4

Verbindungsfehler in SQL Azure sind häufig. Das liegt daran, dass Ihre Anwendung einen Verbindungspool erstellt, aber während Ihre Seite denkt, dass diese Verbindungen vorüber sind, kann Azure sie an ihrem Ende beenden und Sie werden nie davon erfahren.

Sie tun dies aus gültigen Gründen wie eine bestimmte Instanz wurde überlastet und sie übertragen Verbindungen zu einem anderen. Bei In-House-SQL-Servern tritt dieses Problem normalerweise nie auf, da Ihre SQL-Server immer verfügbar und für Sie reserviert sind.

Als ein Beispiel, bekomme ich etwa 5 Verbindungsfehler mit SQL Azure auf etwa 100.000 Datenbankabfragen an einem Tag.

Es wird mit SQL Azure passieren. Wenn Sie ADO.NET verwenden, dann ist Davids Vorschlag der vorübergehenden Fehlerbehandlung der richtige Weg.

Wenn Sie Entity Framework verwenden wollen, gibt es eine gute und eine schlechte Nachricht: Transient Fault Handling with SQL Azure using Entity Framework

1

I SqlConnection und SqlCommand Erweiterungsmethoden implementiert Logik Bereitstellung wiederholen. Es ist verfügbar unter NuGet.