[英]Android Studio, Db connection error: Something unusual has occurred to cause the driver to fail. Please report this exception
[英]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.