2017-02-11 86 views
1

我想創建函數。第一個連接到DB,第二個是完全重新連接,如果第一個失敗。使用mysql本地驅動程序連接到數據庫後出現異常

在我的實驗中,我在開始時關閉DB,以獲得connect塊失敗並調用重新連接塊。之後,我打開數據庫,並期待該連接塊會成功,但我得到例外。

這裏是我的代碼:

bool connect() 
{ 
    if(connection is null) 
    { 
     scope(failure) reconnect(); // call reconnect if fail 
     this.connection = mydb.lockConnection(); 
     writeln("connection done"); 
     return true; 
    } 
    else 
     return false; 

} 


void reconnect() 
{ 
    writeln("reconnection block"); 
    if(connection is null) 
    { 
     while(!connect) // continue till connection will not be established 
     { 
      Thread.sleep(3.seconds); 
      connectionsAttempts++; 
      logError("Connection to DB is not active..."); 
      logError("Reconnection to DB attempt: %s", connectionsAttempts); 
      connect(); 
     } 
    if(connection !is null) 
    { 
     logWarn("Reconnection to DB server done"); 
    } 

    } 

} 

日誌(幾秒鐘後接通DB):

reconnection block 
reconnection block 
connection done 
Reconnection to DB server done 

[email protected]:\Users\Dima\AppData\Roaming\dub\packages\vibe-d-0.7.30\vibe-d\source\vibe\core\drivers\libevent2.d(326): Failed to connect to host 194.87.235.42:3306: Connection timed out [WSAETIMEDOUT ] 

我不明白爲什麼我後主動例外:Reconnection to DB server done

+0

'lockConnection' - 是否應該有一個匹配的「解鎖」? –

回答

1

這裏有兩個主要問題。

首先,根本不需要任何自動重試嘗試。如果它第一次沒有工作,而且你什麼也沒有改變,那麼沒有理由再次突然做同樣的事情。如果你的網絡不可靠,那麼你有更大的問題。

其次,如果你打算反正自動重試,這是代碼不是去上班:

一方面,reconnect呼籲connect兩次每一次失敗:一旦在循環體的末尾,然後無論連接是否成功,都立即在環路條件下再次。這可能不是你想要的。

但更重要的是,您有潛在的無限遞歸:connect如果失敗,則調用reconnect。然後reconnect最多調用connect六次,每次connect在失敗時重新調用reconnect,一直循環直到無法以某種方式神奇地開始工作的連接配置(或者更可能,直到您吹動堆棧並崩潰)。老實說,我建議簡單地扔掉所有的東西:只要撥打lockConnection(如果您使用的是vibe.d)或new Connection(...)(如果您不使用vibe.d)並完成它就可以了。如果您的連接設置錯誤,則再次嘗試相同的連接設置不會解決它們。

lockConnection - 是否應該有一個匹配的「解鎖」? - 裏克詹姆斯

不,所涉及的連接池來自vibe.d。當鎖定連接的光纖退出時(通常意味着「當服務器完成處理請求時」),光纖自動鎖定的任何連接都會返回到池中。

相關問題