这两天遇到个问题, 程序A常驻内存,启动时候先连接mysql保存连接, 之后查询数据库就用该连接,
这样每次查询之前就不再去连接数据库了.可程序经常是启动后一两天就会报Lost connection to MySQL server during query.
查了一下资料怀疑可能是以下原因引起的,mysql默认会话超时时间为8个小时,而程序A查资料的时候是先在缓存redis查找,找不到再去mysql数据库查找.这样如果距最后一次查数据库8个小时内都没有发生查询,那么就会导致会话超时连接断开.解决方法如下:
1.修改会话超时时间
查看会话超时时间
mysql> show session variables where variable_name
='wait_timeout' or variable_name = 'interactive_timeout';
+---------------------+-------+
|
Variable_name | Value |
+---------------------+-------+
| interactive_timeout | 28800 |
|
wait_timeout | 28800 |
+---------------------+-------+
修改全局变量wait_timeout,
interactive_timeout,每个会话的这两个变量的默认值都是由全局变量值来初始化的
mysql> set global wait_timeout = 31536000;
mysql> set global interactive_timeout = 31536000;
这样超时时间就改为1年了,
不过这样修改当重起mysql数据库的时候这两个变量还是会给改为默认值28800,可以通过修改my.cnf文件,
在里面加上wait_timeout = 31536000和interactive_timeout =
31536000这两个配置,这样就可以永久修改了.
2.在代码里面连接的时候设置超时自动重连接
int mysql_options(MYSQL *mysql, enum
mysql_option option, const char *arg)
char value =1;
mysql_options(conn,
MYSQL_OPT_RECONNECT, &value);
5.0.19之前的版本必须在调用mysql_real_connect()之后再调用此函数,因为mysql_real_connect()会重置连接属性为默认值,后面的版本可以在mysql_init()之后mysql_real_connect()之前调用.不过在比较新的版本必须在每次执行SQL之前调用mysql_ping(),测试过在5.6.10的版本可以不用,5.6.15和5.6.20都需要.
关于这个问题总结可参考: