关于解决连接mysql数据库因wait_timeout而造成问题的办法

一、出现的问题

     我的web工程在隔夜连接mysql数据库,会出现错误如下(截取了关键字),需要重启服务器才能ok。

Communications link failure;

 
  
The last packet successfully received from the server was 35,605,633 millise;


二、我的工程环境

      使用了struts2.0+hibernate3.3+spring3;mysql 是5.7。

 

三、原因分析

通过查询网上资料得出,这是由于mysql 服务器默认wait_timeout为28800s,合计8小时。如果8小时后链接还处于sleep状态,mysql将自动将连接断掉。而web工程中默认的连接池用此连接在进行连接将出现错误。

       1、你可通过在mysql 中输入下行代码,查询mysql的参数。

show variables like '%timeout%'; 
     更多知识:wait_timeout 和 interactive_timeout 参数详解请见: http://blog.csdn.net/z1988316/article/details/7976038

    2、你也可在mysql中输入下行代码,查询现在的mysql连接;

show processlist
     结果如下: 关于解决连接mysql数据库因wait_timeout而造成问题的办法_第1张图片


四、解决措施

     目前笔者了解3种解决方法:

    1、更改mysql的wait_timeout时间(不推荐)

     可用set global wait_timeout=XXX;单位为秒,但是最大貌似只能为24天,同时太大会带来诸多弊端。


   2、更改hibernate默认的连接池的配置(不推荐)

    将hibernate.cfg.xml添加以下代码:


   3、在hibernate使用C3P0连接池(推荐)

     hibernate配置C3P0,比较简单,而且是官方推荐的连接池,比自带的连接池好用。所以建议用此方法。

    (1)在C3P0官网下载源码:http://sourceforge.net/projects/c3p0/ ;将其中的c3p0-0.9.1.jar和mchange-commons-java-0.2.11.jar复制到lib下。

    (2)更改hibernate.cfg.xml,添加C3P0的配置:

              其中最关键的是 7200;    

             每隔7200,连接池就会将连接刷新激活,这样就不会造成mysql数据库timeout的问题。







	
		
			org.hibernate.dialect.MySQLDialect
		
		jdbc:mysql://172.22.145.10:3306/rdcms?characterEncoding=utf-8&useSSL=false&autoReconnect=true&useSSL=false
		
		
		root
		12345678
		
			com.mysql.jdbc.Driver
		
		
			mysql_rdcms
		
		
		

        
        org.hibernate.connection.C3P0ConnectionProvider
        	
        100
        
        10
        
        7200
        
        300
        
        3
        
        120
        
        
        Test
        false
  		true

        
        
		
	


         (4)如何测试:

              通过调整 7200 参数,以及10

              你可在mysql 输入 show processlist ;查询存在的连接数以及timeout的时间,知晓你的C3P0是否配置成功,同时也可通过time列知晓连接池是否刷新。

             例如,我配置参数为30(实际不能这么配置)那么time不能大于30s了。

关于解决连接mysql数据库因wait_timeout而造成问题的办法_第2张图片


五、入门文章,希望对大家有所帮助,欢迎大家拍砖,谢谢。


六、另:在常文本型的字段中,字段包过大会导致mysql 错误,lost connect,需手动修改变大

进入mysql server

默认是4M

在mysql 命令行中运行
set global max_allowed_packet = 2*1024*1024*10
然后关闭掉这此mysql server链接,再进入。
show VARIABLES like '%max_allowed_packet%';
查看下max_allowed_packet是否编辑成功

你可能感兴趣的:(关于解决连接mysql数据库因wait_timeout而造成问题的办法)