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>

浙公网安备 33010602011771号