说来就蛋疼了,这个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 查看
这个问题直到今天 才解决,就是在重连时失败的话,重新创建一个swoole mysql客户端去连接,就成功了。