louislivi / SMProxy

Swoole MySQL Proxy 一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。 A MySQL database connection pool based on MySQL protocol and Swoole.
https://smproxy.louislivi.com
MIT License
1.78k stars 257 forks source link

[BUG]MySql 链接长时间没用使用时候,执行sql会报:PDO::exec(): MySQL server has gone away #91

Open david20288 opened 2 years ago

david20288 commented 2 years ago

Describe Your Environment (描述你的环境)

How to Reproduce the Problem? (如何重现问题)

MySql 连接池里面的链接长时间没用使用时候,执行sql会报:PDO::exec(): MySQL server has gone away

More Information (更多信息)

image

...

david20288 commented 2 years ago

是否在使用链接的时候加入 mysql_ping 机制?

louislivi commented 2 years ago

这块需要进一步排查,理论上断开连接后会自动清理掉的,再次请求会重新生成连接。

david20288 commented 2 years ago

这块需要进一步排查,理论上断开连接后会自动清理掉的,再次请求会重新生成连接。 image 您说的是这个清理吗? 但是这个只能判断根据swoole 文档:https://wiki.swoole.com/#/client?id=isconnected isConnected 并不能判断 和mysql server 断开连接了

louislivi commented 2 years ago

不是,是在mysql服务端断开时会收到close事件进行处理 src/MysqlProxy.php:297

    /**
     * close.
     *
     * @param Client $cli
     */
    public function onClientClose(\Swoole\Coroutine\Client $cli)
    {
        MySQLPool::destruct($cli, $this->connName);
    }
david20288 commented 2 years ago

不是,是在mysql服务端断开时会收到close事件进行处理 src/MysqlProxy.php:297

    /**
     * close.
     *
     * @param Client $cli
     */
    public function onClientClose(\Swoole\Coroutine\Client $cli)
    {
        MySQLPool::destruct($cli, $this->connName);
    }

项目还再维护吗?

louislivi commented 2 years ago

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

david20288 commented 2 years ago

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

gordonlhw commented 2 years ago

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

所以是斷開之後, 有新的query / execute, 不會再重新連接了?

david20288 commented 2 years ago

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

所以是斷開之後, 有新的query / execute, 不會再重新連接

david20288 commented 2 years ago

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

所以是斷開之後, 有新的query / execute, 不會再重新連接了? 应该用了不可用的链接,然后才重新连接了。

shuqingzai commented 2 years ago

+1,长时间不使用,我这也会断开连接