我想创建功能。第一个是连接到DB,第二个是完全重新连接,如果第一个失败。
在我的实验中,我在开始时关闭数据库以使connect
阻止失败并调用重新连接阻止。在它之后我打开DB,并期望连接块会成功,但我得到例外。
这是我的代码:
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
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
答案 0 :(得分:1)
这里有两个主要问题。
首先,根本不需要自动重试尝试。如果它第一次没有工作,并且你没有改变任何东西,那么没有理由做同样的事情应该突然第二次工作。如果你的网络不可靠,那么你就会遇到更大问题。
其次,如果您打算自动重试,那该代码将不起作用:
首先,reconnect
在每次失败时调用connect
TWICE:一旦在循环体的末尾,然后立即再次在循环条件下,无论是否连接成功。这可能不是你想要的。
但更重要的是,你有一个潜在的无限递归:connect
如果失败则调用reconnect
。然后reconnect
调用connect
最多六次,每次connect
调用reconnect
失败,永远循环,直到连接配置无法以某种方式工作神奇地开始工作(或者更有可能,直到你吹掉堆栈并崩溃)。
老实说,我建议你把它扔掉:只需拨打lockConnection
(如果您使用的是vibe.d)或new Connection(...)
(如果您不是使用vibe.d)并完成它。如果您的连接设置有误,那么再次尝试相同的连接设置并不能解决这些问题。
lockConnection - 是否应该匹配"解锁"? - 里克詹姆斯
不,有问题的连接池来自vibe.d。当锁定连接的光纤退出时(通常意味着#34;当您的服务器处理完请求时#34;),光纤锁定的任何连接都会自动返回到池中。