使用mysql-native驱动程序连接到DB后出现异常

时间:2017-02-11 20:40:34

标签: database mariadb d vibed

我想创建功能。第一个是连接到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

之后我会遇到异常

1 个答案:

答案 0 :(得分:1)

这里有两个主要问题。

首先,根本不需要自动重试尝试。如果它第一次没有工作,并且你没有改变任何东西,那么没有理由做同样的事情应该突然第二次工作。如果你的网络不可靠,那么你就会遇到更大问题。

其次,如果您打算自动重试,那该代码将不起作用:

首先,reconnect在每次失败时调用connect TWICE:一旦在循环体的末尾,然后立即再次在循环条件下,无论是否连接成功。这可能不是你想要的。

但更重要的是,你有一个潜在的无限递归:connect如果失败则调用reconnect。然后reconnect调用connect最多六次,每次connect调用reconnect失败,永远循环,直到连接配置无法以某种方式工作神奇地开始工作(或者更有可能,直到你吹掉堆栈并崩溃)。

老实说,我建议你把它扔掉:只需拨打lockConnection(如果您使用的是vibe.d)或new Connection(...)(如果您不是使用vibe.d)并完成它。如果您的连接设置有误,那么再次尝试相同的连接设置并不能解决这些问题。

  

lockConnection - 是否应该匹配"解锁"? - 里克詹姆斯

不,有问题的连接池来自vibe.d。当锁定连接的光纤退出时(通常意味着#34;当您的服务器处理完请求时#34;),光纤锁定的任何连接都会自动返回到池中。