mysql 长连接断开问题
从MySQL 5.0.3开始,默认情况下禁止再连接,这是5.0.13中的新选项,提供了一种以显式方式设置再连接行为的方法。
mysql应用程序建立的长连接,大约过8小时会断开【没测过,网上都是这么说的】,这个与mysql的参数wait_timeout有关。可以用
show variables like '%time%';
语句查看下。
解决方法:
1. 修改配置文件:
/etc/my.cnf中wait_timeout的值,比如设置wait_timeout=8640000,即100天
2. mysql语句操作:set iwait_timeout=86400000
// 设定连接的生命周期1年
mysql_query(mysql_connection, "set wait_timeout=31536000");
1> interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。
说得直白一点,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
2> 在连接启动的时候,根据连接的类型,来确认会话变量wait_timeout的值是继承于全局变量wait_timeout,还是interactive_timeout。
3. mysql的API函数:
mysql_options与mysql_ping函数搭配使用,
在建立连接mysql_real_connect函数调用成功后,设置mysql的重连选项,
// 设置自动重连
char value = 1; // 0 禁止重连 1 启动重连
mysql_options(mysql_connection, MYSQL_OPT_RECONNECT, &value);
再建立一个线程,固定频率调用mysql_ping函数,注意问题--------
mysql_ping会改变mysql_affected_rows的返回值。所以最好是给该MYSQL句柄再加一个mutex(最好是读写锁)。当其它线程准备执行query的时候,就获取锁,执行完就释放。而这个执行mysql_ping的线程在执行ping之间先尝试获取锁,如果获取失败,则继续sleep,放弃这一轮的ping。
不过网上有人说,如果设置了MYSQL_OPT_RECONNECT(),那么mysql_query()是可以完成自动重连的。