SSH项目过一段时间之后再访问会报一次Could not open Hibernate session for transaction 异常,Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlyi,再重新方法即可访问成功(通常出现在过了一晚之后再去访问系统)

前端时间到客户那去进行项目的上线测试,将项目部署好之后,运行都是正常的,可是每到了第二天早上访问的时候,就会报一个Could not open Hibernate session for transaction 异常,Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception,当时很摸不着头脑,后来就开始从数据库连接的源头开始找,本次项目中用的是c3p0连接池,并将其交给了spring管理,所以在配置文件中配置了一些数据库连接的必要属性,数据库驱动、数据库url、用户名和密码等,但是总感觉问题出在这,c3p0通过这些配置竟然第一次访问不到数据库,在通过一番查阅资料之后,了解到mysql经过28800秒也就是8小时之后会将所有的空闲连接关闭,而c3p0经过6000000秒才会断开连接,所以很有可能出现mysql的连接已经关掉了,而c3p0还没有保持着连接,所以每次过完8小时访问之后,通过c3p0去访问的时候,c3p0还处于正常连接状态则会去直接请求打开事务然后访问数据库,而此时的数据库已经关闭,自然就出现了Hibernate不能打开session的异常。

  解决办法是在配置文件中加入: 

<!-- 使c3po每隔28000检查已有的连接是否可用 -->

<property name="idleConnectionTestPeriod" value="28000"></property>
<!-- 最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0 -->
<property name="maxIdleTime" value="28000"></property>
<property name="preferredTestQuery" value="测试连接数据库的sql语句"></property>  ----比如select *  from systemInfo;

 

 

异常:  
javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:   
   
root cause   
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:   
   
   
解决方案:  
1.  
给jdbc url 增加 autoReconnect=true 一定能解决你的问题,可以定期观察一下 show processlist  
改进方法如下:  
<property name="url" value="jdbc:mysql://localhost/数据库实例名  
称?&useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/>  
   
2.  
寻找支持重连的连接池。  
           注意:c3p0连接池支持重连;重连参数是:  
               idleConnectionTestPeriod   设置空闲连接测试周期  
               preferredTestQuery : 设置一查询语句,用于重连测试  
              testConnectionOnCheckin设置为true  
              testConnectionOnCheckout设置为true  
   
在sessionFactory里配置:  
<property name="hibernateProperties">  
   <props>  
        <prop key="hibernate.autoReconnect">true</prop>   
  </props>  
</property>  

 

posted @ 2017-07-31 10:41  糖水泡果子  阅读(382)  评论(0)    收藏  举报