近在用hibernate做持久化操作,可是MySQL对所有连接的有效时间默认为28800秒,正好8小时,如果一个连接8小时没有任何操作,其就会自动断开;但是对于Hibernate来说,它的连接池并不知道它所管理的连接中是否有被MySQL断开的;而hibernate的默认连接池不对链接的状态进行检查,所以超过8小时候链接就不在可用,从而导致查询出错;虽说可以增大MySQL的连接有效时间;但是时间一旦超过最大值,还是会自动断开。
经查资料发现,Hibernate共支持5种连接池,其中ProxoolConnectionProvider连接池在稳定性、易用性以效率方面都比较优越,遂决定采用Proxool连接池代替hibernate的默认连接池,在hibernate.cfg.xml的同一目录下增加proxool.xml文件;proxool的jar以及配置文件见附件;具体配置如下:
hibernate.cfg.xml的配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<property name="hibernate.proxool.xml">proxool.xml</property>
<property name="hibernate.proxool.pool_alias">mysql</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="myeclipse.connection.profile">myconnect</property>
<property name="hibernate.cache.use_query_cache">false</property>
<mapping resource="org/youtuface/Youtuface.hbm.xml" />
</session-factory>
</hibernate-configuration>
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:3987/youdb?useUnicode=true&characterEncoding=utf8
</driver-url>
<!-- JDBC驱动名称 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!-- 数据库连接帐号 -->
<driver-properties>
<property name="user" value="root" />
<property name="password" value="123456" />
</driver-properties>
<!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 -->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受 -->
<maximum-new-connections>200</maximum-new-connections>
<!-- 最少保持的空闲连接数 --> <prototype-count>3</prototype-count>
<!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 -->
<maximum-connection-count>2000</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>
经过以上配置修改,mysql连接一直可用,终于解决问题啦~~