产生这个错误一般是由于两个方面的原因,一个是由于向mysql server发送的数据包大小超过了参数max_allowed_packet设置的大小,这个可以通过减小数据包或加大max_allowed_packet参数来解决
但是对于大多数情况来说都是由于mysql的wait_timeout这个参数决定的,默认值是288000,即8个小时,空闲8个小时没动作,mysql就会结束该连接,这个问题有以下几种解决办法:
1、修改mysql服务器的全局配置,增大wait_timeout参数值;
2、在mysql_real_connect函数连接后,设置当前连接中的wait_timeout参数;
3、在mysql_real_connect函数之前,调用mysql_options函数启用MYSQL_OPT_RECONNECT选项,启用这个选项后connect后,在mysql_real_query函数发现连接丢失就会自动重新连接数据库并执行当前sql语句;
4、在当前的连接进程中新建一线程定时调用mysql_ping函数,这个函数当检查到mysql连接断开后,会自动重连,但是一定要注意,这个重连也和MYSQL_OPT_RECONNECT选项有关系,如果没有指定这个选项,mysql_ping是不会自动重连的;
不过,请注意,自动重新连接也会导致一些副作用,如下:
* 任何活动的交易都被回滚,autocommit模式被置为reset。
* 所有表锁都释放
* 所有临时表是关闭(撤消)
* 会话变量被重新初始化为相应的变量。
* 用户变量设置都将丢失。
* 编制报表释放。
* 句柄变量被关闭。
* LAST_INSERT_ID()被重置为0 。
* 使用GET_LOCK()获得的锁被释放
5、最后一个方法也是最灵活的方法,就是自己在应用底层实现,当mysql_real_query返回错误代码为[2006]时就自动调用mysql_real_connect重新连接并设置自己的环境和会话信息等;
但是对于大多数情况来说都是由于mysql的wait_timeout这个参数决定的,默认值是288000,即8个小时,空闲8个小时没动作,mysql就会结束该连接,这个问题有以下几种解决办法:
1、修改mysql服务器的全局配置,增大wait_timeout参数值;
2、在mysql_real_connect函数连接后,设置当前连接中的wait_timeout参数;
3、在mysql_real_connect函数之前,调用mysql_options函数启用MYSQL_OPT_RECONNECT选项,启用这个选项后connect后,在mysql_real_query函数发现连接丢失就会自动重新连接数据库并执行当前sql语句;
4、在当前的连接进程中新建一线程定时调用mysql_ping函数,这个函数当检查到mysql连接断开后,会自动重连,但是一定要注意,这个重连也和MYSQL_OPT_RECONNECT选项有关系,如果没有指定这个选项,mysql_ping是不会自动重连的;
不过,请注意,自动重新连接也会导致一些副作用,如下:
* 任何活动的交易都被回滚,autocommit模式被置为reset。
* 所有表锁都释放
* 所有临时表是关闭(撤消)
* 会话变量被重新初始化为相应的变量。
* 用户变量设置都将丢失。
* 编制报表释放。
* 句柄变量被关闭。
* LAST_INSERT_ID()被重置为0 。
* 使用GET_LOCK()获得的锁被释放
5、最后一个方法也是最灵活的方法,就是自己在应用底层实现,当mysql_real_query返回错误代码为[2006]时就自动调用mysql_real_connect重新连接并设置自己的环境和会话信息等;
最好的办法是在mysql_real_connect函数前,启用MYSQL_OPT_RECONNECT选项