Mysql+hibernate 长时间不操作再进入,导致连接池关闭的问题解决。

来源:互联网 发布:linux c语言 文件路径 编辑:程序博客网 时间:2024/05/19 14:19


最近总是发现自己的MySQL数据库,隔天不登陆一次,就会出现以下错误:

ERROR [2016-04-27 07:59:38] [http-bio-80-exec-10] org.hibernate.transaction.JDBCTransaction:95 - JDBC begin failedcom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)at com.mysql.jdbc.Util.getInstance(Util.java:387)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:862)at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1237)at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1232)at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4832)at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91)at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:556)at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)at com.sun.proxy.$Proxy21.chkShopUsernameUnique(Unknown Source)at com.wxshop.sys.ShopAdminLoginController.adminLogin(ShopAdminLoginController.java:80)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
上网查看了一下,基本靠谱的回答是,MySQL的默认wait-timeout是8小时,8小时后自动关闭闲置链接,我的问题发生频率也基本在8小时左右,解决方法如下:

参考帖子:http://www.cnblogs.com/interdrp/p/4177648.html

a)解决的方法有3种:
    增加wait_timeout的时间。
    减少Connection pools中connection的lifetime。
    测试Connection pools中connection的有效性。
b)具体解决方案:
   1、换一下JDBC驱动,JDBC3.1.0-alpha及以前版本会出现此问题,下载新的JDBC驱动
  2、使用hibernate配置:
使用hibernate: 
<property name="connection.autoReconnect">true</property>  <!--这个是最主要的--> 
<property name="connection.autoReconnectForPools">true</property> 
<property name="connection.is-connection-validation-required">true</property> 
加入以上property,可解决此问题,如果未使用hibernate等持久化管理框架,可在mysql的url中加入autoReconnect=true,这样就可以解决。
原因很简单。在对数据库操作结束后关闭连接是正确的做法,没什么大问题。至于出现:No operations allowed after connection closed。这样的问题原因只有一个,你这里和数据库的连接Connection是一个Static的,程序共享这一个Connection。所以第一次对数据库操作没问题,当把Connection关闭后,第二次还想操作数据库时Connection肯定不存在了。

但是 我按照上面的配置 启动系统出现错误,提示SAX解析失败,所以变通一下:
改为添加一下代码到hibernate配置:
<!-- MySql的连接池等待时间是8小时  8小时后自动断掉连接池 所以应该设定autoReconnect-->
                <prop key="connection.autoReconnect">true</prop>
                <prop key="connection.autoReconnectForPools">true</prop>
                <prop key="connection.is-connection-validation-required">true</prop>
效果起不起作用,明天看一下效果。

0 0
原创粉丝点击