2010-10-06 58 views
3

我繼承了與做DB以下的操作方式散落數百次相當大的C#代碼庫:乾淨的方法來重試失敗System.Data.SqlClient的操作

using (SqlConnection connection = new SqlConnection(connectionString)) { 
    SqlCommand command = new SqlCommand(queryString, connection); 
    command.Connection.Open(); 
    command.ExecuteNonQuery(); 
} 

然而,由於外界因素我的控制,數據庫服務器非常殘酷,特別容易出現故障,所以這些查詢中很大一部分失敗。鑑於這種訪問數據庫的特殊方式遍佈在代碼中,我怎樣才能在一個地方編碼重試,並且在任何地方都可以使用SqlCommand

的幾點思考:

  • 我試圖重寫SqlConnection/SqlCommandExecuteNonQuery這樣我就可以創建一個包裝版本。不好。 SqlConnectionSqlCommand是密封的C#對象。
  • 我可以創建一個名爲MySqlConnection的容器類,其中包含一個.NET SqlConnection對象,然後創建我自己的ExecuteNonQuery,然後再重試SqlCommand.ExecuteNonQuery()幾次。然而,這是不好的,因爲我將不得不實施每一個SqlCommand函數並且訓練其他人直接使用我的包裝類而不是SqlCommand。不幸的是,用戶教育在這種情況下不是可接受的解決方案。我與其他被外包的開發人員卡住,經常有人離職,並且不會聽我的請求使用新的SQL類。
  • 正如我之前提到的,我只是無法訪問(政治和技術上)使用數據庫層。這個問題的根本原因只是一個糟糕的SQL服務器設置,但我無法解決這個級別的問題。

我還有其他的選擇嗎?

+1

順便說一句,你還需要在你的'SqlCommand'周圍使用''。此外,FYI,'SqlClient'與C#無關 - 它是.NET的一部分。 – 2010-10-06 21:22:36

+0

實際上並不需要處理SqlCommand。它來自IDisposable的唯一原因是因爲它來自Componant。 Dispose for Componant的功能是從其父站點中刪除組件。所有這一切都是爲了*將n下的所有東西拖放到Form *人羣(即VB類型)上。 – Tergiver 2010-10-06 23:04:50

回答

3

假設一個2x4的位和飛機票的外包「合作伙伴」是出了問題,

你可能想在像postsharp(HTTP左右看看://www.sharpcrafters .com /)來製作面向方面的解決方案。基本上寫一些代碼,可以掛鉤各種方法。然後,您可以在SqlCommand上連接事件;處置,信息和狀態變化可能產量有用的,如果你是幸運

我會說,最好的解決方案來說服你的經理一個正確的代碼修復是唯一的理智的解決方案。我對你的痛苦非常熟悉,但是任何允許他人編寫他們的軟件的公司都應該能夠承擔責任來驗證軟件的質量,或者準備忽略低質量並接受後果。

在識別真正糟糕的SQL性能代碼時,可能會有里程來查看是否可以釋放一些SQL服務器資源。

好運

0

你有沒有想過,做你所需要的,併成爲使DB調用標準簡單實用的方法呢?當然,它與你的包裝思想是一致的,但它不會允許離岸團隊的阻力,因爲他們不需要使用不同的類型。它可能只是將工作抽象到一個地方的原因。

我們需要集中我們的數據庫處理等......折騰一些花哨的話給管理層......然後你走開......

好像你可以從政治立場上拉下那一個不行?

0

如果你能負擔得起的開銷,一種選擇是寫一些「DB代理」。

您的代碼將指向代理(通過它的連接字符串)。代理反過來會指向實際的DB(通過它的連接字符串)。代理會攔截數據庫請求,在真實數據庫上執行它們,並返回結果。但是在這樣做的時候,它可以實現一種算法來使查詢更可靠(通過實施重試等)。

只是說。這將是一種在不改變代碼的情況下實施重試的方法。