文章出處

ADO.NET連接SQL Server有時候聯機會無故的中斷 (例如閑置過久或是交易時間太長等因素),這時又要重新連接,在.NET Framework 4.5之前,這件事情要由開發人員自己依照ADO.NET的SqlException來判斷并自行重試,重試的算法也要由開發人員來自定義,所以SQL Database的CAT (Customer Advisory Team) 開發了Transient Fault Framework給Windows Azure的開發人員使用,而.NET Framework 4.5.1則正式將它納入ADO.NET的核心程序代碼中,能夠斷開會話狀態并在適當的時候恢復會話,很多場景都會收益于這個功能.

ADO.NET Idle Connection Resiliency這個功能被包裝在Entity Framework 6中,在DbConfiguration設定DbExecutionStrategy對象,Entity Framework 6內建了四種不同的DbExecutionStrategy[http://msdn.microsoft.com/pt-BR/data/dn456835],分別是:

說明

DefaultExecutionStrategy

執行時不包含重試策略,這會自動用于SQL Server以外的數據庫。

DefaultSqlExecutionStrategy

執行時不包含重試策略,但是它會包裝例外狀況,由使用者決定是否要啟用Connection Resiliency。

DbExecutionStrategy

這個對象是所有執行策略的基礎類別,它包裝了指數式重試原則 (exponential retry policy) 算法,并且由實作來決定要如何使用這個算法,以及重試的次數等。

SqlAzureExecutionStrategy

專為SQL Azure Database設計的重試策略,會依照已知的可能瞬斷問題進行自動的重試處理。

使用 IDbConnectionStrategy 可以配置重試次數。 EF 中包含的 SQL Server 提供程序用來指定 default:SqlServer­ExecutionStrategy,它會顯示錯誤消息告知調整瞬態連接引發異常的策略。 另外一個策略 SqlAzureExecutionStrategy 通過微調可以連接 Windows Azure SQL 數據庫。

最簡單的策略指定方法是使用新的 DbConfiguration 類,使用該類可以很容易配置特定數據庫提供程序的行為。 以下命令可以讓 EF 針對 SqlClient 使用 SQLAzureExecutionStrategy:

  1.           SetExecutionStrategy (SqlProviderServices.ProviderInvariantName,
  2.   () => new SqlAzureExecutionStrategy());
  3.        

不僅連接策略可以配置,而且您還可以自己創建策略并根據需要通過編程暫停使用它們。

上文提到的 Transient Fault Framework 其實Enterprise Library的一個模塊。這個框架考慮到了處理所有可能的瞬態錯誤的需求,在內部實現了一個“Retry Policy”來確保只處理需要的錯誤。在客戶進入重試狀態前會使用策略驗證這個異常是否屬于瞬態錯誤。

  • 提供了一個可擴展的Retry邏輯處理瞬態錯誤,不僅限于SQL Server。
  • 支持一系列的重試方案(固定周期,漸進周期,隨機指數退避)
  • 支持SQL 連接和SQL命令使用不同的Retry策略。
  • SqlConnectionSqlCommand對象提供了擴展方法來實現Retry操作
  • 支持Retry后的回調,通知用戶代碼是否發生了Retry情況
  • 支持快速重試模式,當第一次發生進行Retry時會立即嘗試而沒有延遲
  • 允許在應用程序配置文件中定義Retry策略
  • 支持同步和異步請求

下面是幾個類似的項目:

 

譯文:SQL Azure客戶端-瞬態錯誤處理最佳實踐

基于Enterprise Library 6 的AOP實現


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()