簡體   English   中英

使用 mysql-native 驅動程序連接到數據庫后出現異常

[英]Exception after connection to DB with mysql-native driver

我想創建功能。 第一個是連接到數據庫,第二個是如果第一個失敗則完全重新連接。

在我的實驗中,我在開始時關閉 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");
    }

    }

}

日志(幾秒鍾后打開數據庫):

reconnection block
reconnection block
connection done
Reconnection to DB server done

object.Exception@C:\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

這里有兩個主要問題。

首先,根本不需要自動重試。 如果它第一次不起作用,並且你沒有改變任何東西,那么做同樣的事情就沒有理由第二次突然起作用。 如果您的網絡如此不可靠,那么您的問題就會大得多。

其次,如果您無論如何都要自動重試,那么代碼將不起作用:

一方面, reconnect connect在每次失敗時調用connect TWICE:一次在循環體的末尾,然后立即再次進入循環條件,無論連接是否成功。 這可能不是你想要的。

但更重要的是,你有一個潛在的無限遞歸:如果失敗, connect調用reconnect 然后reconnect調用最多connect六次,每次connect調用在失敗時reconnect ,一直循環直到無法正常工作的連接配置以某種方式神奇地開始工作(或者更有可能,直到您炸毀堆棧並崩潰)。

老實說,我建議簡單地扔掉所有這些:只需調用lockConnection (如果您使用 vibe.d)或new Connection(...) (如果您不使用 vibe.d)並完成它。 如果您的連接設置錯誤,則再次嘗試相同的連接設置不會修復它們。

lockConnection——是否應該有一個匹配的“解鎖”? — 里克·詹姆斯

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM