mysql_ping 阻塞问题

在解决MySQL has gone away问题时使用mysql_ping,但在特定条件下可能会发生阻塞。通过iptables模拟网络中断,发现mysql_ping会阻塞。调用栈显示阻塞在vio_read函数。设置读取超时(MYSQL_OPT_READ_TIMEOUT)可以解决此问题,但可能影响长时间查询。寻求更优解决方案。
摘要由CSDN通过智能技术生成

在日常开发过程中,为了解决Mysql has gone away问题使用了函数mysql_ping进行数据库的重连,不过在使用中发现mysql_ping有可能会永远阻塞,测试如下:

首先建立好数据库连接,然后sleep(20),在20秒内添加iptables规则,如下:

iptables -A INPUT -p tcp --dport 3306 -jDROP

20秒后使用mysql_ping测试连接,发现会阻塞再mysql_ping,函数调用栈如下:

(gdb) bt

#0 0x00a70402 in __kernel_vsyscall ()

#1  0x00da2b8b in read () from/lib/libpthread.so.0

#2 0x00157238 in vio_read (vio=0x9c21600, buf=0x9c22260 "\a",size=16384) at viosocket.c:47

#3 0x001572ae in vio_read_buff (vio=0x9c21600, buf=0x9c26268"\001", size=4) at viosocket.c:86

#4 0x00157cd5 in my_real_read (net=0x9c21e98, complen=0xbffc30e8) atnet.c:816

#5 0x00158000 in my_net_read (net=0x9c21e98) at net.c:1011

#6 0x001526c8 in cli_safe_read (mysql=0x9c21e98) at client.c:693

#7 0x00154d15 in cli_advanced_co

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值