2013-03-08 95 views
5

我已經實現了以下代碼,用於在寫入Azure數據庫時處理具有指數退避的INSERT/UPDATE重試邏輯。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."); 
} 

但是我應該考慮對我的數據庫讀取應用重試邏輯嗎?或者SqlCommand.CommandTimeout()方法是否足夠?我大部分的讀是使用下面的代碼提起:

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

很難知道會發生在生產環境中使用Azure的,所以我想現在要做的儘可能多的緩解儘可能什麼樣的瞬態錯誤的。

回答

5

我認爲重試將成爲Windows Azure SQL數據庫操作的一部分。

您是否看過Microsoft Patterns and Practices發佈的transient fault handling application block,專門針對SQL數據庫,而不是實施定製解決方案?

+0

我正在調查這個。 TFH塊是否會提供有關連接丟失原因的詳細信息? – QFDev 2013-03-10 11:33:27

4

SQL Azure中的連接失敗很常見。這是因爲您的應用程序將創建連接池,但在您的方面認爲這些連接已結束時,Azure可能會終止它們,並且您永遠不會知道它。

他們這樣做是出於正當的理由,例如特定的實例已經過載並且正在將連接轉移到另一個實例。對於內部SQL服務器,您通常不會遇到此問題,因爲您的SQL Server始終可用且專用於您的使用。

作爲一個例子,我每天在大約100,000個數據庫查詢中得到5次SQL Azure連接失敗。

這將發生在SQL Azure中。如果您使用的是ADO.NET,那麼David對瞬態故障處理的建議就是要走的路。

如果你要使用實體框架,有一個好消息和一個壞消息:Transient Fault Handling with SQL Azure using Entity Framework

1

我已經實現SqlConnectionSqlCommand擴展方法提供重試邏輯。它在NuGet上可用。