hibernate+mysql8小时链接自动断开用Proxool进行解决

近在用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&amp;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连接一直可用,终于解决问题啦~~

猜你喜欢

转载自blog.csdn.net/taozhiweigis/article/details/81668391