我有一個使用在Azure中運行的LINQ-TO-SQL的相當大的Web應用程序,並且遇到來自SQL Azure的瞬態錯誤,因此需要實施重試。我知道了Transient Fault Handling Framework和幾個網站,讓例子來說明如何使用它,但它看起來像你有你的LINQ查詢中的每一個包裹在類似這樣的東西:SQL Azure上LINQ-TO-SQL的重試邏輯 - 高效實現?
RetryPolicy retry = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromSeconds(5));
Result = retry.ExecuteAction(() =>
{
… LINQ query here...
});
數以百計LINQ查詢在我的數據層中,這看起來非常混亂,再加上這樣的事實:查詢在枚舉結果之前並未實際執行。例如,我的數據層中的大部分函數都返回一個IQueryable直到業務層(這使得它們比返回List更加靈活)。所以那意味着你不得不用數據庫重試邏輯來拋棄你的業務邏輯層 - 醜陋。所以我想爲了保持數據層中的重試邏輯,我必須在所有查詢中放置.ToList(),以便它們在那裏執行,而不是在上面的圖層中執行。
我真的希望有一種方法可以在某些基類中實現重試邏輯,而不必更改所有的查詢。似乎EF也會有這個問題。
真正的答案是嘗試與SQL-Azure團隊進行自動重試,因此我們不必擔心在我們的代碼中出現這種情況嗎?
這會有所幫助,但是我不需要擔心在枚舉代碼後纔會實際執行的查詢嗎?因此,我必須真正調查每個查詢並找出數據庫實際被調用的位置。 – PeteShack 2012-04-18 13:28:08
對不起,我無法很好地理解你。你的意思是你擔心出現問題,因爲將查詢包裝在重試框架中會更難找到問題的根源?在這種情況下,我想建議你在retry.ExecuteAction上設置一個斷點,並逐步完成代碼。 – 2012-04-19 07:42:32
不,我的意思是將重試邏輯添加到具有數百個查詢的現有應用程序將是一項艱鉅的任務 - 主要是因爲數據庫調用不一定發生在數據層的linq-to-sql查詢中。查詢的執行可能會延遲,直到IQueryable被實際枚舉 - 這可能發生在業務層。這似乎不是一個乾淨的解決方案,這個問題。 – PeteShack 2012-04-19 13:25:37