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

当MySQL+Hibernate应用在长时间无操作后重新使用,可能会遇到连接池关闭的问题。这个问题通常涉及到数据库连接超时和连接池管理策略。解决方法包括调整数据库连接超时设置、配置连接池的最小和最大连接数、启用连接验证等措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

ERROR [2016-04-27 07:59:38] [http-bio-80-exec-10] org.hibernate.transaction.JDBCTransaction:95 - JDBC begin failed
com.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>
效果起不起作用,明天看一下效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值