2011-06-02 60 views
1

我有一個C#中的服務應用程序,它從一個數據庫查詢數據並將其插入另一個SQL數據庫。SQL服務器恢復機制

有時,MSSQLSERVER服務會因不明原因而崩潰,我的應用程序也會崩潰。我想做一個SQL恢復機制,在我寫入數據庫之前檢查以確保sqlconnection狀態正常,但我該如何做?

我試過停止MSSQLSERVER服務和sqlconnection.State始終打開,即使MSSQLSERVER服務停止。

+1

的問題不相關,但是這聽起來有點可笑「有時候,MSSQLSERVER服務爲墜毀原因不明」 :) – 2011-06-02 04:09:09

+0

「有時候,MSSQLSERVER服務墜毀的原因不明」 - 它應該永遠不會崩潰。當我說永遠不會,我的意思是永遠不會! – 2011-06-02 04:12:47

+0

它做到了!該服務在運行數天後停止。任何決議?我需要在代碼中進行一些檢查。嘗試使用sqlconnection.State屬性,但總是OPEN。 – ove 2011-06-02 04:24:11

回答

0

我認爲你選擇的方法不是很好。

如果您的應用程序是某種計劃作業,請讓它崩潰。沒有數據庫 - 沒有工作可以完成。在這種情況下,這是可以的。下一次它運行和分貝是它會做它的事情。您也可以實施重試。

如果您的應用程序是內部的Windows服務和某種計劃的計時器,您只需確保您的服務不會因處理SqlExcpetion而崩潰。再次重試,直到服務器啓動。

此外,您可能想要使用分佈式事務。爲了保證複製過程的完整性,但是否需要它,取決於要求。

[編輯]針對重試問題。

var attemptNumber = 0; 
while (true) 
{ 
    try 
    { 
     using (var connection = new SqlConnection()) 
     { 
      connection.Open(); 

      // do the job 
     } 
     break; 
    } 
    catch (SqlException exception) 
    { 
     // log exception 
     attemptNumber++; 
     if (attemptNumber > 3) 
      throw; // let it crash 
    } 
} 
+0

是的,我試圖做一個重試,但我如何檢查SQL連接關閉?儘管MSSQLSERVER服務已關閉,但狀態屬性始終顯示爲OPEN。 – ove 2011-06-02 05:06:44

+0

@overule - 如果你保持連接打開,這是不好的。我用重試方法更新了答案。 – 2011-06-02 05:16:07

+0

我必須保持連接處於打開狀態,因爲SQL數據稍後進入而不是立即進入,所以我無法連接到數據庫並立即斷開連接。 – ove 2011-06-02 06:02:01

1

第一:解決您的真正問題。 SQL Server應該非常非常穩定。

其次:考慮在客戶端應用程序和服務器上使用MSMQ(或SQL Service Broker)來排隊更新。

+0

我需要一種檢查SQLConnection狀態的方式,但狀態總是反映錯誤的狀態。我必須修復代碼以確保其穩定。 – ove 2011-06-02 05:09:40

+0

@overrule:首先修復你的服務器。 – 2011-06-02 05:10:12

1

從根本上調用SQL命令之前檢查連接狀態的一般策略將不起作用。如果服務在連接檢查後崩潰,但在調用SQL命令之前會發生什麼?

您可能需要弄清楚在數據庫關閉時拋出什麼異常,並在適當的代碼層從該異常中恢復。

+0

很難讓SQL服務崩潰。我需要在我的代碼中放入一些東西,這樣纔不會再發生。 – ove 2011-06-02 05:28:18

+0

您可以設置斷點,停止SQL服務,然後恢復代碼執行以模擬崩潰並找出將拋出的異常。 – 2011-06-02 15:03:41

+0

當然,正如其他人所說的,SQL服務崩潰應該不常見。但是爲無法訪問(網絡問題等)做好準備是一個好主意,應該在您的客戶端應用程序中正確處理。 – 2011-06-02 15:05:46

0

手動它是一些很難修復損壞的sql數據庫,特別是那些誰不技術上堅實。這些類型的人可以使用任何第三方應用程序。很多可用的谷歌。好消息是,他們中的很多人都提供免費試用版,在免費版中你可以修復你的數據庫並且可以看到恢復原始結果的預覽。這是我從Google獲得的一個應用程序。 http://www.softmagnat.com/sql-database-recovery.html