Mysql网络断开重连问题

最近做一个项目的后台守护程序,需要多线程对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_optins

mysql_ping

然后在以后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()获得的锁被释放

时间: 2024-10-28 11:37:02

Mysql网络断开重连问题的相关文章

【bug-004】【tcp】网络断开重连后,客户端recv函数一直阻塞,不会返回

[前提]客户端采用tcp阻塞模式[现象]与相机设备建立连接后,偶尔出现几次突然就收不到相机发过来的数据:几经排查,怀疑跟网络波动有关,于是通过插拔网线来模拟网络波动,果然bug复现. [原因](个人理解)每一个节点(包括服务器.客户端.中间节点)都应该会用一个五元组(源IP.源端口.目的IP.目的端口和协议)来纪录一个tcp会话,哪一个节点出现网络波动,那么该节点的纪录就会被清空.所以网络恢复后,服务器端(相机)发来的数据就不会到达客户端,客户端则一直阻塞在recv函数. [解决方案]1.换成非

网络断开后重连downloadProvider继续下载问题

最近在安卓4.4上遇到一个断开wifi后重新连接wifi, downloadProvider继续下载文件失败的问题.于是开始了解下载管理模块的断点续载功能: 1.首先,分析android log, 当将网络断开之后,下载会中止,出现如下信息: W/DownloadManager(29473): Aborting request for download 5: Failed reading response: java.net.SocketException: recvfrom failed: E

bind9+dlz+mysql连接断开问题

前言 关于bind-dlz介绍:http://bind-dlz.sourceforge.net/ DLZ(Dynamically Loadable Zones)与传统的BIND9不同,BIND的不足之处: BIND从文本文件中获取数据,这样容易因为编辑错误出现问题. BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存. BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间. 如果近修改一条记录,那么要重新加载或者重启BIND 才能生效,那么需要时间,可

netty 实现心跳检查--断开重连--通俗易懂

一.心跳介绍 网络中的接收和发送数据都是使用操作系统中的SOCKET进行实现.但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题. 1.心跳机制: 是服务端和客户端定时的发送一个心跳包(自定义的数据结构体),让对方知道自己还活着,处于在线状态,以确保连接真实有效的一种机制. 2.心跳检查: 心跳检查是查看服务端和客户端是否定时的在正常的发送心跳包. 在java的定时线程任务中,我们也可以去实现定时的一些轮询任务,但是netty给我们提供了一些自身封装实现好的一些心跳检查机制,我们

[android] 网络断开的监听

标签: android 网络监听 杂谈 分类: Android [转自]  http://blog.sina.com.cn/s/blog_5d5996d001012o07.html 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就可以实现网络的监听,下面是代码--- onCreate的时候实例化 //监听器     private NetState receiver=new NetSta

mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 详细出处参考:http://www.jb51.net/article/32284.htm

MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效.在这种情况下,如果客户端代码向 c3p0 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常 解决这个问题的办法有三种: 1. 增加 MySQL 的 wait_timeout 属性的值. 修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置: # Set a connection to w

[转载]win7休眠后网络断开怎么办?如何设置?

http://jingyan.baidu.com/article/8065f87fc87d0423312498af.html 有时会遇到在Windows7系统休眠模式下会自动断开网络连接,唤醒系统也是无法连接,网络断开,怎么办呢?首先win7系统是没有问题的,其次在Windows7系统中也介绍过休眠模式在待机的状态下是不会断开网络的,下面教大家如何解决休眠后网络断开的问题. 方法/步骤 具体步骤如下:1,右键单击桌面上的“计算机”属性, 2,单击左侧的“设备管理器”: 3,点击网络适配器: 4,

MySQL选用可重复读之前一定要想到的事情

原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必要知道..(随着了解的深入这个极有可能再增加..)1.DDL会引起metadata lock,导致请求连环阻塞,甚至是查询请求.http://blog.itpub.net/29254281/viewspace-1383193/ 2.MySQLDump和XtraBackup的flush table命令

让命令提交后不受本地关闭终端窗口/网络断开连接的干扰

项目中操作场景:本地机器上通过ssh连接服务器进行相关操作.这里就出现一个问题,在我们本地程序中,向服务器发送一个命令是没有任何问题的,可是当本次程序意外关闭或者由于网络断开连接,这是我们通过本地程序在服务器上创建的进程也就会被杀死.所以问题就来了:如何让对应进程能无间断的执行,即通过本机程序在服务器上创建一个进程,当本地关闭ssh连接或者与服务器的网络断开之后,这个创建的进程要继续存在而不会被杀死.在IBM 上看到一遍文章,对这个问题的解决方法讲解的很详细,现在简要介绍下: 我们知道,当用户注