2013-03-08 19 views
5

Ho implementato il seguente codice per la gestione della logica di ripetizione INSERT/UPDATE con backoff esponenziale durante la scrittura in un database di Azure.Logica tentativi database SQL Azure

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

Tuttavia, dovrei considerare l'applicazione della logica di retry anche per il mio database? O sarebbe sufficiente il metodo SqlCommand.CommandTimeout()? La maggior parte della mia letture sono istituiti utilizzando il seguente codice:

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

E 'difficile sapere che tipo di errori temporanei avverrà in un ambiente di produzione con Azure così sto cercando di fare il più possibile la mitigazione come ora.

risposta

5

Penso che i tentativi faranno parte delle operazioni del database SQL di Windows Azure in generale.

Piuttosto che implementare una soluzione personalizzata, hai guardato il transient fault handling application block pubblicato da Microsoft Patterns and Practices, in particolare per il database SQL?

+0

Sto esaminando questo ora. Il blocco TFH fornirà informazioni dettagliate sul motivo del rifiuto di una connessione? – QFDev

4

Gli errori di connessione in SQL Azure sono comuni. Questo perché l'applicazione creerà un pool di connessioni ma, mentre la tua parte pensa che queste connessioni siano finite, Azure potrebbe terminarle alla fine e non ne saprai mai.

Lo fanno per motivi validi, ad esempio un'istanza particolare è stata sovraccaricata e stanno trasferendo le connessioni a un'altra. Con i server SQL interni in genere non si ottiene questo problema perché i server SQL sono sempre disponibili e dedicati per l'uso.

Ad esempio, ottengo circa 5 errori di connessione con SQL Azure su circa 100.000 query di database in un giorno.

Succede con SQL Azure. Se si utilizza ADO.NET, il suggerimento di David di gestire i guasti transitori è la strada da seguire.

Se avete intenzione di utilizzare Entity Framework, v'è una buona notizia e una cattiva notizia: Transient Fault Handling with SQL Azure using Entity Framework

1

Ho implementato SqlConnection e SqlCommand metodi di estensione che fornisce riprovare logica. È disponibile su NuGet.

Problemi correlati