mysql断线重连不起作用

icewangww

GatewayWorker+thinkphp5.1,操作数据库,使用TP的DB类,Mysql数据库默认连接是8小时。
在TP的命令行下的其他命令,配置断线重连,始终有效。

config('database.break_reconnect',true);
Db::Connect(config('database.'));

但在GatewayWorker中,大约每隔48小时,数据库就会连接失败:
[attach]1226[/attach]

GatewayWorker进程中,数据库初始化连接如下:
[attach]1227[/attach]

在重连1次失败后,再次重连就发生:“error: 2006 MySQL server has gone away”错误。

再次强制重连,依然无效:

[attach]1228[/attach]

暂时的解决办法就是stop停止GatewayWorker,再重新start -d启动GatewayWorker。
这样马上就能连接成功,数据立即能更新。

请walkor老大帮忙排查一下原因。快个把月了,采取了各种方法,都不行。

8341 6 1
6个回答

walkor

你可以尝试下用完数据库就关闭,用的时候再连

  • icewangww 2018-09-11

    按照大牛walkor的方法,在GatewayWorker进程中,每次读写数据库都强制重新连接,已稳定运行5天,没有gone away了。不过总感觉这是偏方啊。幸亏在设计时GatewayWorker进程中很少操作数据库,否则可能极大的影响性能。

Heywood

大神如果用您说的方式 , 执行mysql事务还会有作用吗?

  • 暂无评论
寒川

也遇到过这个问题,已经解决

  • guonan89 2019-04-26

    能请教下怎么解决的吗,我也遇到了

guonan89

能请教下怎么解决的吗?

adminppper

同问。

  • 暂无评论
iwhot

我特喵的直接手动断
找到项目目录thinkphp/library/think/db/Query.php加个方法

/**
* 手动断线
*/
public function close()
{
    $this->connection->close();
}

找到项目目录thinkphp/library/think/Db.php
顶部注释中加上 @method Query close() static 手动断线

然后需要的地方最后面用Db::close();

  • 暂无评论
年代过于久远,无法发表回答
🔝