2017-02-11 88 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。当锁定连接的光纤退出时(通常意味着“当服务器完成处理请求时”),光纤自动锁定的任何连接都会返回到池中。

相关问题