使用DBCP连接池时出现MySql 8小时断开连接的解决方法

原文地址为: 使用DBCP连接池时出现MySql 8小时断开连接的解决方法

 org.hibernate.exception.JDBCConnectionException: could not extract ResultSet] with root cause

Jan 05, 2016 10:14:09 AM org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/book-shuxiang-api] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not extract ResultSet] with root cause

java.net.SocketException: Broken pipe

at java.net.SocketOutputStream.socketWrite0(Native Method)

at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)

at java.net.SocketOutputStream.write(SocketOutputStream.java:153)

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)

at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3634)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2460)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)

at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962)

at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)

at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)

at org.hibernate.loader.Loader.getResultSet(Loader.java:2065)

at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)

at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)

at org.hibernate.loader.Loader.doQuery(Loader.java:909)

at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)

at org.hibernate.loader.Loader.doList(Loader.java:2553)

at org.hibernate.loader.Loader.doList(Loader.java:2539)

at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)

at org.hibernate.loader.Loader.list(Loader.java:2364)

at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)

at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)

at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)

at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)

at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)

at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)

at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)

at com.book.persist.dao.im.impl.GroupDaoImpl.getByGroupId(GroupDaoImpl.java:122)

at com.book.service.book.im.impl.GroupServiceImpl.getByGroupId(GroupServiceImpl.java:237)

at com.book.service.book.im.impl.GroupServiceImpl$$FastClassByCGLIB$$1a96e08e.invoke(<generated>)

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)

at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)

at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)

at com.book.service.book.im.impl.GroupServiceImpl$$EnhancerByCGLIB$$f571d131.getByGroupId(<generated>)

at com.book.shuxiang.api.controller.im.GroupController.groupInfo(GroupController.java:193)

at com.book.shuxiang.api.controller.im.GroupController$$FastClassByCGLIB$$21102ae2.invoke(<generated>)

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)

at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:64)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)

at com.book.shuxiang.api.controller.im.GroupController$$EnhancerByCGLIB$$8e4569e5.groupInfo(<generated>)

使用DBCP连接池时出现MySql 8小时断开连接的解决方法

修改l配置文件:

修改如下:

 

  1. <data-sources>  
  1.         <data-source key="org.apache.struts.action.DATA_SOURCE"   type="org.apache.commons.dbcp.BasicDataSource">  
  2.         <set-property property="driverClassName" value="com.mysql.jdbc.Driver" />  
  3.         <set-property property="description" value="wjjg" />  
  4.         <set-property property="url" value="jdbc:mysql://localhost/wjjg?useUnicode=true&characterEncoding=GB2312" />  
  5.         <set-property property="password" value="12345678" />  
  6.         <set-property property="username" value="wjjg" />  
  7.         <set-property property="maxActive" value="10" />  
  8.         <set-property property="maxIdle" value="60000" />  
  9.         <set-property property="maxWait" value="60000" />  
  10.         <set-property property="defaultAutoCommit" value="true" />  
  11.         <set-property property="defaultReadOnly" value="false" />    
  12.         <set-property property="testOnBorrow" value="true"/>  
  13.         <set-property property="validationQuery" value="select 1"/>  
  1. </data-source>  

     其中testOnBorrow  validationQuery 很重要。

testOnBorrow的意思是从数据库连接池中取得连接时,对其的有效性进行检查。

validationQuery是用来检查的SQL语句,“select 1”执行较快,是一个不错的检测语句。

回顾

当测试人员反映到这个问题的时候,很快就锁定了Mysql八小时的问题,但是解决方案却费了我不小功夫,先是考虑到修改mysql配置文件肯定是不太合理的,弃之。

然后想了一下在一个servlet中写了个定时器,让它每两小时查一下数据库,运行了几天发现问题仍然存在,将定时器间隔时间修改为30分钟、3分钟仍然无济于事,异常照常出现,弃之。

在网上搜了一下解决方案也挺多,把

<set-property property="testOnBorrow" value="true"/>  

  1.         <set-property property="validationQuery" value="select 1"/>  

写入到配置文件中,运行报错,说bean中没有这两个属性,查看了一下原来是我用的c3p0连接池,而这个解决方案是针对DBCP连接池的。

最后在配置文件中,添加了

 

  1. <property name="maxIdleTime"value="1800"/>  

成功解决了问题。

感悟,问题很简单,就是改个配置文件,但是遇到问题需要快速解决问题的能力,更需要认真的态度。


 

 

 

 

 

 

 

 


转载请注明本文地址: 使用DBCP连接池时出现MySql 8小时断开连接的解决方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值