SwooleDistributed 3 MYSQL连接池在数据库重启后全部失效怎么解决?

说来就蛋疼了,这个SwooleDistributed 3的框架在我开发项目之前就已经停止更新了,上面让用这个框架开发一这一个项目。现在的问题是我的mysql连接是使用了官方说的连接池进行的,然后数据库重启后,连接池全挂。可以看到底层逻辑是会进行重连的,但是报如 Connection refused 2006 的数据库连接错误,请问大神们这到底是mysql的问题,还是框架程序的问题?

这个框架的文档如下:https://www.kancloud.cn/tmtbe...

下面是重连代码 :

 /**
     * @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) {
                $this->pushToPool($client);
                $errcode = $client->errno ?? '';
                $mysqlCoroutine->getResult(new SwooleException(sprintf("err:%s,code:%s", $client->connect_error, $errcode)));  //在这里报的错
            }
        }
        $res = $client->query($sql, $mysqlCoroutine->getTimeout() / 1000);
        if ($res === false) {
            $this->pushToPool($client);
            if ($client->errno == 110) {
                $mysqlCoroutine->onTimeOut();
            } else {
                $mysqlCoroutine->getResult(new SwooleException("[sql]:$sql,[err]:$client->error"));
            }
        }
        $mysqlCoroutine->destroy();
        if ($delayRecv)//延迟收包
        {
            $data['delay_recv_fuc'] = function () use ($client) {
                $res = $client->recv();
                $data['result'] = $res;
                $data['affected_rows'] = $client->affected_rows;
                $data['insert_id'] = $client->insert_id;
                $data['client_id'] = $client->id;
                $this->pushToPool($client);
                return $data;
            };
            return new MysqlSyncHelp($sql, $data);
        }
        $data['result'] = $res;
        $data['affected_rows'] = $client->affected_rows;
        $data['insert_id'] = $client->insert_id;
        $data['client_id'] = $client->id;
        if (!$notPush) {
            $this->pushToPool($client);
        }
        return new MysqlSyncHelp($sql, $data);
    }

下面是报的错:

oaSoftServer |  > [Error] 访问:http://localhost:8081/Error?id=qitsvee1ttaq9b4dng8ik12ei3 查看
oaSoftServer |  > [EX] --------------------------[报错指南]----------------------------2021-11-26 08:56:14
oaSoftServer |  > [EX] 异常消息:err:Connection refused,code:2006
oaSoftServer |  > [EX] 运行链路:
oaSoftServer |  > [EX] 0#  Server\Middlewares\MonitorMiddleware::before_handle -> 0.017166137695312 ms
oaSoftServer |  > [EX] 1#  app\Controllers\StaffController::getStaffCard -> 9.2499256134033 ms
oaSoftServer |  > [EX] 2# ─ app\Models\Business\OAuserLogic::testLogic -> 9.2141628265381 ms
oaSoftServer |  > [EX] 3# ── app\Models\Data\TestModel::getTestData -> 9.1981887817383 ms
oaSoftServer |  > [EX] 4# ─── Server\Asyn\Mysql\Miner::_query -> 9.1609954833984 ms
oaSoftServer |  > [EX] 5#  app\Controllers\StaffController::onExceptionHandle
oaSoftServer |  > [EX] --------------------------------------------------------------
oaSoftServer |  > [Error] 访问:http://localhost:8081/Error?id=7s53bvihn4a1v8dfkbp83s8f31 查看
阅读 2.1k
1 个回答

这个问题直到今天 才解决,就是在重连时失败的话,重新创建一个swoole mysql客户端去连接,就成功了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题