2013-10-29 122 views
0

我正在寫數據庫應用程序(與MyDac組件和MySql服務器),我需要你的幫助。想象一下情況: 1.應用程序啓動 - 連接存在,一切正常。 2.然後MySql服務器崩潰或僅發生連接問題 3.用戶試圖從數據庫中選擇一些數據 BOOM!應用程序正在走向無限循環(試圖建立連接)MySql連接丟失德爾福

我不知道該怎麼做。我很高興把這個查詢放在一個線程中。我已經知道我必須爲這個線程創建一個單獨的連接。由於缺乏使用線程的經驗,我無法做到這一點。如果你寫一個例子或給我一個建議,那將是非常棒的。我希望對你有所幫助,謝謝

+0

你有什麼樣的連接處理? – admdrew

+1

'「我已經知道我要創建該線程一個單獨的連接。由於缺乏經驗與線程的工作我不能做到這一點。」'要創建線程一個單獨的連接意味着你必須創建一個從代碼連接並僅在該線程中使用該連接。我很想知道,應用程序如何進入循環。我認爲只有當你發現任何異常時纔會發生,然後再試一次,直到你得到一個正確的結果,這顯然不會發生。但爲了進一步提供幫助,任何異常消息和一段代碼都可能有所幫助。 – GolezTrol

+0

實際上,如果沒有連接並且您嘗試執行某些操作,則會發送請求並等待響應。但它不會來,因爲服務器已關閉。我使用MyDac(TMyConnection組件直接連接到數據庫)。屬性「本地故障轉移」爲「true」,並在「OnConnectionLost」事件重試模式:= rmReconnectExecute。如果建立連接,應用程序將繼續工作,但它始終保持循環; – user2933949

回答

0

爲了避免無限嘗試重新連接服務器,可以使用計數器變量。例如,你可以使用下面的代碼:

 

var 
    RetryCount: Integer; 

procedure TMainForm.MyConnection1ConnectionLost(Sender: TObject; 
    Component: TComponent; ConnLostCause: TConnLostCause; 
    var RetryMode: TRetryMode); 
begin 
    if RetryCount < 2 then begin 
    Inc(RetryCount); 
    RetryMode := rmReconnectExecute; 
    end 
    else begin 
    RetryCount := 0; 
    RetryMode := rmRaise; 
    end; 
end; 
 

在這種情況下,MyDAC將嘗試重新連接到服務器的兩倍,並在發生故障的情況下,會產生異常。