最近做一个项目的后台守护程序,需要多线程对mysql数据库服务进行操作,为了加强守护撑的健壮性,特地连接成功后拔掉网线,然后测试守护程序断开重新连接的健壮性,可是发现网络断开后,重新插上网线,用mysql_real_conncet进行重新连接返回的永远是假,也就是重新连接失败,之后我想断开网络后重新将mysql连接释放(mysql_close(MYSQL )),并重新初始化mysql_init((MYSQL )),然后再用mysql_real_conncet()函数进行连接,但是这样做的后果是mysql_real_connect()报错,报错内容为没有足够的内存,明明我的电脑还有5个G空闲内存,居然说内存不够。。。
经过查阅资料,发现有一个叫mysql_options的函数,结合mysql_ping函数,mysql连接断开后可以自动重新连接:
使用mysql_ping来自动检查重连。用到两个函数,一个是mysql_ping,另外一个是mysql_options。具体使用方法是在mysql_real_connect之前,mysql_init之后,使用mysql_options。用法如下:
char value = 1;
(void) mysql_init (&mysql);
mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&value);
结合百度百科的使用方法:
然后在以后mysql_query之前首先使用mysql_ping进行判断,如果连接已经断开,会自动重连,或者再查询失败后,执行mysql_ping函数,然后自动重新连接mysqlsever.
不过,请注意,自动重新连接也会导致一些副作用,如下:
* 任何活动的交易都被回滚,autocommit模式被置为reset。
* 所有表锁都释放
* 所有临时表是关闭(撤消)
* Session variables are reinitialized to the values of the corresponding variables.会话变量被重新初始化为相应的变量。 这也影响那些隐式声明的变量,SET NAMES。比如使用This also affects variables that are set implicitly by statements such as SET NAMES.这也影响了变量,是一套由含蓄的声明,例如订定的名称。
* 用户变量设置都将丢失。
* 编制报表释放。
* 句柄变量被关闭。
* LAST_INSERT_ID()被重置为0 。
* 使用GET_LOCK()获得的锁被释放