ADO.NET的彈性鏈接控制[ADO.NET idle connection resiliency]

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的核心程序代碼中,可以斷開會話狀態並在適當的時候恢復會話,不少場景都會收益於這個功能.html

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

github

說明算法

DefaultExecutionStrategysql

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

DefaultSqlExecutionStrategy編程

執行時不包含重試策略,可是它會包裝例外情況,由使用者決定是否要啓用Connection Resiliency。框架

DbExecutionStrategy異步

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

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實現

相關文章
相關標籤/搜索