PHP前端开发

SwooleDistributed 3中,MySQL连接池如何解决数据库重启后连接失效的问题?

百变鹏仔 2天前 #PHP
文章标签 重启

mysql连接池在数据库重启后失效的解决方法

在swooledistributed 3中,如果使用官方提供的mysql连接池,数据库重启后,所有连接可能失效。导致这个问题的原因可能是由于底层重连逻辑存在问题。

以下是解决方法:

  1. 修改重连代码:
$result = $client->connect($set);if (!$result) {    // 创建新的客户端并重试连接    $client = new swoolecoroutinemysql();    $result = $client->connect($set);}

通过此修改,如果重连失败,程序会创建一个新的客户端并重新尝试连接。

  1. setdefer值问题:

确保重连时将setdefer值设置为false,因为事务不允许设置此值。

$client->setdefer(false);

示例代码:

/** * @param $sql * @param null $client * @param MySqlCoroutine $mysqlCoroutine * @return mixed * @throws Throwable */public function query($sql, $client = null, MySqlCoroutine $mysqlCoroutine){    $notPush = false;    $delayRecv = $mysqlCoroutine->getDelayRecv();    if ($client == null) {        $client = $this->pool_chan->pop();        $client->setDefer($delayRecv);    } else {//这里代表是事务        $notPush = true;        //事务不允许setDefer        $delayRecv = false;        $client->setDefer($delayRecv);    }    if (!$client->connected) {        $set = $this->config['mysql'][$this->active];        $result = $client->connect($set);        if (!$result) {            // 创建新的客户端并重试连接            $client = new SwooleCoroutineMySQL();            $result = $client->connect($set);            if (!$result) {                $this->pushToPool($client);                $errcode = $client->errno ?? '';                $mysqlCoroutine->getResult(new SwooleException(sprintf("err:%s,code:%s", $client->connect_error, $errcode)));  //在这里报的错            }        }    }    // ...}