天天看點

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的核心程式代碼中,能夠斷開會話狀态并在适當的時候恢複會話,很多場景都會收益于這個功能.

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設計的重試政策,會依照已知的可能瞬斷問題進行自動的重試處理。

上文提到的 Transient Fault Framework 其實Enterprise Library的一個子產品。這個架構考慮到了處理所有可能的瞬态錯誤的需求,在内部實作了一個“Retry Policy”來確定隻處理需要的錯誤。在客戶進入重試狀态前會使用政策驗證這個異常是否屬于瞬态錯誤。

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

下面是幾個類似的項目:

  • SQL Fault Retry Provider提供了一個如何建立高可用性應用程式的案例,當然特指在SQL Mirroring環境下。并且提供了一個可以進行重試操作的 Data Provider.
  • Endjin Retry Framework:提供了一下TPL的 重試架構
  • Polly: 提供了一個.NET 3.5/4.0/4.5 下都可用的重試庫
  • 通過nuget上 查詢retry可以查到很多相關的項目 https://www.nuget.org/packages?q=retry 

繼續閱讀