在MYSQL的默认设置中,如果一个数据库连接超过8小时没有使用(闲置8小时),服务器将断开这条连接,后续在该连接上进行的查询操作都将失败。网络上对该问题的描述非常多。也提供了相应的解决办法。我在这里提一些我自己的看法。
解决办法一:修改MYSQL服务器的配置参数
道理非常简单,MYSQL的默认设置是在数据库连接超过8小时没有使用后将其断开,如果我们将这个时间改成更大的数值,那么连接超时所需的时间就会更长,也就意味着更不容易超时。网络上提供的修改方法一般是修改/etc/my.cnf,在这个文件中添加一行wait_timeout=你需要设置的超时时间 。实际上有一种比较简单的方法来修改这个参数:
首先作为超级用户登录到MYSQL,注意必须是超级用户,否则后面会提示没有修改权限。然后输入
show global variables like \'wait_timeout\';
回车执行后显示目前的超时时间:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
上面显示的是默认的超时时间,即8个小时(单位是秒)。现在重新设置该参数,例如我们要将超时时间设置成10个小时,可以输入:
set global wait_timeout=36000;
回车执行,显示:
Query OK, 0 rows affected (0.00 sec)
表示设置成功,可以重新使用show global variables like \'wait_timeout\'来验证。
这种方法比较直观,而且设置的参数立即生效。
解决办法二:在客户端中检查连接是否有效
解决办法一非常简单,客户端不需要做任何改动就可以延长超时时间。但是在某些情况下我们可能无法修改MYSQL的配置参数。在这种情况下,唯一的解决办法就是在客户端中主动检测连接是否已经被服务器断开,然后重新建立到服务器的连接。由于不同的客户端或者不同的开发语言检测的办法不一样,我这里仅仅以我们项目中使用的MYSQL++为例简单介绍一下具体方法。
MYSQL++中以Connection类表示一个MYSQL连接,在该类中有一个函数专门用于测试连接是否仍然有效,即Connection::ping,这个函数没有参数,返回一个bool变量,如果连接仍然有效,则返回true,否则返回false。我们可以在查询之前调用此函数,测试连接是否有效,如果连接已经被断开,这个函数返回false,我们只需要使用Connection::connect函数重新建立连接即可。
另外,在连接已经被断开的情况下,在连接上进行一次查询之后,调用Connection::errnum函数将返回错误代码2006(在没有任何错误的情况下返回0),开发者也可以根据这个返回值判断连接是否被断开,然后采取下一步行动。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oyster2008/archive/2009/11/28/4893649.aspx