前一天对数据库进行插入、查询、更新都没有问题,第二天使用的的时候一旦触发mysql_query()就会造成插入失败甚至段错误。
由于项目实际需要,连接数据库后,没有mysql_close()。
经过百度一波后,查询到的内容为,当一个连接连接到服务器后,如果在wait_time时间内不进行任何交互后,服务器就会断开连接,这种情况的直观表现是:超时后,第一次对数据库进行操作,会返回2006:Server has gone way的错误码。
如何查询wait_time时间?
进入到数据库后 设置时间: set global wait_timeout=60;(非交互的时间) set global interactive_timeout=60;(交互的时间) 查看时间: show global variables like'wait_timeout'; show global variables like 'interactive_timeout'; 查看连接数: show status like 'Threads%';
项目中使用的mysql的版本是:5.1.72
对于这种问题,网上说法是使用mysql_query之前使用mysql_ping接口,此接口会检查该连接是否正常,但只使用mysql_ping是不会进行自动重连的,要跟着mysql_option()添加MYSQL_OPT_RECNNECT属性一起使用才能达到效果。
复现效果和测试demo想要复现效果,就要改动两个时间,一个是wait_timeout的时间,一个是interactive_timeout的时间,如果根据上述修改方式进行修改,在重启mysql后还是需要重新修改的,想要永久的修改就只能修改配置文件my.cnf(windows: my.ini)。
#include#include #include int main() { MYSQL *mysql = mysql_init(NULL); char value = 1; mysql_options(mysql,MYSQL_OPT_RECONNECT,(char *)&value); if(NULL ==mysql_real_connect(mysql, "hostIP", "username", "password", "database", port, NULL,0)) { printf("%sn",mysql_error(mysql)); return 0; } int ret = mysql_ping(mysql); if(mysql_query(mysql,"insert_sql")) { printf("err1:%d:%sn",mysql_errno(mysql),mysql_error(mysql)); } else printf("ok~n"); printf("ret = %dn",ret); int block_num; scanf("%d",&block_num); //触发定时 sleep(60*2); //wait_timeout时间 printf("sleep is overn"); ret = mysql_ping(mysql); if(mysql_query(mysql,"insert_sql")) { printf("err2:%d:%sn",mysql_errno(mysql),mysql_error(mysql)); } else printf("ok~~n"); printf("ret = %dn",ret); return 0; }
传送门:【MySQL :: MySQL 5.6 C API 开发者指南 :: 5.4.49 mysql_options()】



