账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    SwooleDistributed 3 MYSQL连接池在数据库重启后全部失效怎么解决?
    75
    0
    说来就蛋疼了,这个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:14oaSoftServer | > [EX] 异常消息:err:Connection refused,code:2006oaSoftServer | > [EX] 运行链路:oaSoftServer | > [EX] 0# Server\Middlewares\MonitorMiddleware::before_handle -> 0.017166137695312 msoaSoftServer | > [EX] 1# app\Controllers\StaffController::getStaffCard -> 9.2499256134033 msoaSoftServer | > [EX] 2# ─ app\Models\Business\OAuserLogic::testLogic -> 9.2141628265381 msoaSoftServer | > [EX] 3# ── app\Models\Data\TestModel::getTestData -> 9.1981887817383 msoaSoftServer | > [EX] 4# ─── Server\Asyn\Mysql\Miner::_query -> 9.1609954833984 msoaSoftServer | > [EX] 5# app\Controllers\StaffController::onExceptionHandleoaSoftServer | > [EX] --------------------------------------------------------------oaSoftServer | > [Error] 访问:http://localhost:8081/Error?id=7s53bvihn4a1v8dfkbp83s8f31 查看
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 不娇不傲我的范の 普通会员 1楼

      当数据库重启后,SwooleDistributed的MySQL连接池中的所有连接通常会失效,因为原有的TCP连接已经被关闭。为了解决这个问题,您需要在数据库连接池中实现重连机制或者定期检测连接有效性。

      以下是一种可能的解决方案:

      1. 设置连接超时与重试: 在创建连接池时,设置合适的connect_timeoutwait_timeout参数,当连接超时时自动重新建立连接。

      2. 实现心跳检测: 通过定时任务(如Swoole的Timer)定期向数据库发送简单的查询(如SELECT 1),检查连接是否有效。如果发现连接已断开,则从连接池中移除该连接,并重新创建一个新的连接放入连接池。

      3. 监听数据库服务器的主从切换或重启事件: 如果条件允许,可以尝试获取数据库服务器的相关状态通知,在接收到重启或主从切换等可能导致连接失效的通知后,主动清理并重建连接池。

      4. 使用第三方组件: 某些第三方数据库连接池组件已经实现了类似的功能,例如PDO的某些扩展库或者专门针对MySQL的连接池管理器,它们能在连接失效时自动进行恢复。

      示例代码(仅供参考):

      php // 心跳检测 $swoole_timer_tick(60 * 1000, function () use ($mysqlPool) { $conn = $mysqlPool->get(); if (!$conn) { return; } try { $result = $conn->query('SELECT 1'); if ($result === false) { // 连接失效,重新放入连接池以触发重建连接 $mysqlPool->put($conn); } } catch (\Throwable $e) { // 连接失效,重新放入连接池以触发重建连接 $mysqlPool->put($conn); } finally { // 不论结果如何,都释放本次获取的连接 $mysqlPool->release($conn); } });

      请注意,以上代码仅为示例,实际使用时请根据您的具体需求和技术栈进行调整。同时,SwooleDistributed的具体实现细节也会影响最终解决方案的设计。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部