本文转自http://blog.sina.com.cn/s/blog_6e6bbaf20100uocd.html,所有权利归原作者所有。

前段时间刚完成一个项目,数据库为MySQL5.0,持久层使用Hibernate 3.2,没有使用额外的连接池,那么Hibernate会默认使用它自带的一个默认连接池,也就是 DriverManagerConnectionProvider。问题是待机一晚上后,第二天早上第一次登录总是失败。察看日志发现如下错误:

“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.”
经过一番调研,发现很多人都碰到过类似问题,但网上令人满意的回答并不多。mysql网站上的提问也很多,但
并没有正确答案;百度知道上倒是有一个近似正确的回答。现将本人的解决办法总结一下:

  当时也搞不清楚为什么,但重启Tomcat后就一切回复正常了,但是又过了一天,问题再次出现。仔细分析错误信息,问题肯定出在数据库连接部分,在网上查阅大量信息后,明确了问题的原因:MySQL对所有连接的有效时间默认为28800秒,正好8小时,也就是说,如果一个连接8小时没有请求和操作,就会自动断开;但是对于Hibernate来说,它的连接池并不知道它所管理的连接中是否有被MySQL断开的。如果一个程序要使用数据库连接,而 Hibernte的连接池分配一个已经被MySQL断开了的给程序使用,那么便会出现错误。
  为了证实确实是这个错误,我在本机上做了如下测试:首先启动Tomcat,网站能够正常打开;然后修改系统
时间,往后调1天;然后再打开网站,同样的问题果然出现!MySQL + Hibernate架构相当普遍,所以这个问题也
相当普遍,若读者也有这样的项目,建议做一下同样的测试,看看是否存在此问题!

  问题找到了,怎么解决呢?
  ——思路1:增大MySQL的连接有效时间;
上述问题是由mysql5数据库的配置引起的。mysql5将其连接的等待时间(wait_timeout)缺省为8小时。在其客户
程序中可以这样来查看其值:
mysql﹥
mysql﹥ show global variables like 'wait_timeout';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| wait_timeout | 28800 |
+---------------+---------+
1 row in set (0.00 sec)
28800 seconds,也就是8小时。
如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql5就将该连接关闭
。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错
误。这解释了为什么我的程序第二天不能登录的问题。
你可能会想到在tomcat的数据源配置中有没有办法解决?的确,在jdbc连接url的配置中,你可以附上
“autoReconnect=true”,但这仅对mysql5以前的版本起作用。增加“validation query”似乎也无济于事。
本人觉得最简单的办法,就是对症下药:既然问题是由mysql5的全局变量wait_timeout的缺省值太小引起的,我
们将其改大就好了。
查看mysql5的手册,发现对wait_timeout的最大值分别是24天/365天(windows/linux)。以windows为例,假设我
们要将其设为21天,我们只要修改mysql5的配置文件“my.ini”(mysql5 installation dir),增加一行:
wait_timeout=1814400
需要重新启动mysql5。
 
  ——思路2:从程序自身出发,修改连接池的相关参数。
  显然,思路1是不可行的,一方面这个思路不可能保证这个问题绝对的解决,如果无访问时间够长,还是大
于MySQL的连接有效时间,问题同样会发生;另一方面,一般情况下,我们都是将程序部署在别人服务器上,我
们不可能去修改MySQL配置。那么只能从思路2入手了。
  经查资料发现,Hibernate支持如下的连接池:
   DriverManagerConnectionProvider:代表由Hibernate提供的默认的数据库连接池
   C3P0ConnectionProvider:代表C3P0连接池
   ProxoolConnectionProvider:代表Proxool连接池
   DBCPConnectionProvider:代表DBCP连接池
   DatasourceConnectionProvider:代表在受管理环境中由容器提供的数据源
  其中,默认连接池并不支持在分配一个连接时,测试其有效与否的功能,而C3P0、Proxool、DBCP都提供了
这样的功能,正好可以解决上述问题。综合考虑各个连接池的效率、稳定性、易用性,决定换用Proxool,它确
实在各方面表现优良,方便配置。
  下面就看看如何配置Proxool:
  1、Hibernate配置文件:
--------------------------------------------------Hibernate配置文件------------------------------
----------------------------
<session-factory>
<property name="proxool.pool_alias">mysql</property>
<property name="proxool.xml">proxool.xml</property>
<property name="connection.provider_class">
org.hibernate.connection.ProxoolConnectionProvider
</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/lab1000/jcom/pojo/Admin.hbm.xml" />
...
</session-factory>
------------------------------------------------------------------结束---------------------------
-------------------------------
其中各属性含义如下:
hibernate.connection.provider_class:指明使用Proxool连接池
hibernate.proxool.xml:指明Proxool配置文件所在位置,这里与Hibernate的配置文件在同一目录下
hibernate.proxool.pool_alias:指明要使用的proxool.xml中定义的proxool别名。
  2、Proxool配置文件(proxool.xml):
---------------------------------------------------------------proxool.xml-----------------------
-------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<!-- proxool别名 -->
<alias>mysql</alias>
<!-- 数据库连接Url -->
<driver-url>
jdbc:mysql://localhost/yourDatebase?useUnicode=true&characterEncoding=UTF-8
或者:
jdbc:mysql://localhost:3306?characterEncoding=gbk
</driver-url>
<!-- JDBC驱动名称 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!-- 数据库连接帐号 -->
<driver-properties>
<property name="user" value="root" />
<property name="password" value="password" />
</driver-properties>
<!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 -->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受 -->
<maximum-new-connections>20</maximum-new-connections>
<!-- 最少保持的空闲连接数 -->
<prototype-count>3</prototype-count>
<!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-
connections决定 -->
<maximum-connection-count>20</maximum-connection-count>
<!-- 最小连接数 -->
<minimum-connection-count>3</minimum-connection-count>
<!-- 在分配连接前后是否进行有效性测试,这个是解决本问题的关键 -->
<test-before-use>true</test-before-use>
<test-after-use>true</test-after-use>
<!-- 用于测试的SQL语句 -->
<house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql>
</proxool>
</something-else-entirely>
--------------------------------------------------------结束-------------------------------------
------------------------------
   3、下载和安装Proxool的包文件
  下载地址:http://proxool.sourceforge.net/download.html
  下载后并解压后,将其中lib文件夹下的jar文件拷贝到你站点的WEB-INF/lib下
  自此,Proxool配置成功。重新启动Tomcat,再次做上述测试,问题解决。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jsx112/archive/2010/09/18/5892551.aspx

MySQL+Hibernate下连接空闲8小时自动断开问题解决方案相关推荐

  1. 客户端连接mysql 自动断开_MySql连接空闲8小时自动断开的原因及连接池配置方法...

    数据库连接超时时间查询 非交互式超时时间,如 JDBC 程序 show global variables like 'wait_timeout'; 交互式超时时间,如数据库工具 show global ...

  2. mysql没多久自动断开服务_mysql 长时间没连接了 就会自动断开服务

    这是因为mysql 长时间没连接了 就会自动断开服务. 解决办法 1.首先,下载必须的jar包 dbcp 包,目前版本是1.2.1:http://jakarta.apache.org/commons/ ...

  3. mysql长时间后断开_mysql 长时间没连接了 就会自动断开服务

    这是因为mysql 长时间没连接了 就会自动断开服务. 解决办法 1.首先,下载必须的jar包 dbcp 包,目前版本是1.2.1:http://jakarta.apache.org/commons/ ...

  4. 解决MySQL8小时自动断开连接的问题(DBCP配置)

    背景 最近做的一个JavaWeb项目,持久层用SpringJDBC+DBCP+MySQL.一开始只配置了DBCP的一些常用参数,没有注意对空闲连接的检查和回收.项目部署在tomcat后,刚开始使用没用 ...

  5. Mac下ssh连接远程服务器时自动断开问题

    在mac下使用securecrt通过ssh连接远程服务器时,总会一段时间没有动作后,ssh被自动断开.在windows下用xmanager貌似没有遇到过这个问题. 在网上找了解决方法如下: 客户端配置 ...

  6. SecureCRT使用SSH连接linux超时后自动断开

    今天开发的同事,和我说 SecureCRT连接到IDC服务器,老超时断开,影响工作了 研究了下. 因为客户端与服务器之间存在路由器,防火墙以及为了本身的安全性,在超过特定的时间后就会把空闲连接断开.或 ...

  7. 远程桌面连接笔记本,wifi自动断开导致远程断开解决方法

    1.适配器选项 2.找到无线网卡并右击 3.选择[状态]下的[无线属性] 4.勾选[即使网络未广播其名称也连接...] 5.点击[安全]标签下的[高级设置] 6.勾选[为此网络启用单一登录]并选择用户 ...

  8. oracle自动结束连接,如何在Oracle8x中实现自动断开后再连接?

    识别及断开空闲用户的存储过程 上面的查询语句可以得到系统中所有的连接用户的一些基本情况,但是又如何来实现系统自动判断空闲超过一定时间的连接并将其自动断开呢?Oracle系统提供了一种称之为后台任务(J ...

  9. 海湾crt显示与服务器连接断开,secureCRT自动断开的解决方法

    转: secureCRT自动断开的解决方法 在secureCRT上登录时,一段时间不用的话会自动断开,必须重新连接,有点麻烦. 有时候服务器端的 /etc/profile 或者 ~/.bash_pro ...

最新文章

  1. Docker 简介以及构架剖析
  2. Android点赞音效播放
  3. 准时制 jit 减少库存
  4. vim补全html标签,vim括号引号html标签自动补全
  5. springcloud 文件服务器,SpringCloud传文件
  6. WinForm中DataGridView的TextBoxColumm换行
  7. 【TensorFlow】学习资源汇总以及知识总结
  8. php 重新编译_linux下为php添加GD库(重新编译php)
  9. 11月TIOBE编程语言排行榜,OC已经掉出前十
  10. hibernate 继承映射(二)
  11. Xamarin.Forms Layout Challenges – Great Places(已全文翻译)
  12. Linux_shell 学习
  13. Android 测试入门之---Monkey test
  14. 高德地图车机版缩放版_高德地图车机版2020
  15. JAVA中的I/O流
  16. win10 excel编辑无响应问题解决方法
  17. 17-[案例1]奇虎导航案例
  18. matlab虚数求模,matlab计算带有复数的函数,最后求复数函数的模,结果里面却有...
  19. win10卸载更新的方法
  20. ScrollView和GestureDetector触屏事件冲突

热门文章

  1. Oracle 游标使用全解(转)
  2. Windows Phone 7(accelerometer)重力感应编程
  3. 公司的故事之老板的平衡术
  4. 柯达新款Wi-Fi数码相机闪亮登场
  5. webpack如何将css文件分离的,webpack--css:Less文件的打包和分离(八)
  6. mysql 命令限制_MySQL 命令总结
  7. 回顾丨2021数据库大咖讲坛(第6期)视频PPT互动问答
  8. 排序归并连接Merge Sort Join
  9. 6种常见的地标识别算法整理和总结
  10. Spark的分布式存储系统BlockManager全解析