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配置文件:
修改如下:
- <data-sources>
- <data-source key="org.apache.struts.action.DATA_SOURCE" type="org.apache.commons.dbcp.BasicDataSource">
- <set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
- <set-property property="description" value="wjjg" />
- <set-property property="url" value="jdbc:mysql://localhost/wjjg?useUnicode=true&characterEncoding=GB2312" />
- <set-property property="password" value="12345678" />
- <set-property property="username" value="wjjg" />
- <set-property property="maxActive" value="10" />
- <set-property property="maxIdle" value="60000" />
- <set-property property="maxWait" value="60000" />
- <set-property property="defaultAutoCommit" value="true" />
- <set-property property="defaultReadOnly" value="false" />
- <set-property property="testOnBorrow" value="true"/>
- <set-property property="validationQuery" value="select 1"/>
- </data-source>
其中testOnBorrow 和 validationQuery 很重要。
testOnBorrow的意思是从数据库连接池中取得连接时,对其的有效性进行检查。
validationQuery是用来检查的SQL语句,“select 1”执行较快,是一个不错的检测语句。
回顾
当测试人员反映到这个问题的时候,很快就锁定了Mysql八小时的问题,但是解决方案却费了我不小功夫,先是考虑到修改mysql配置文件肯定是不太合理的,弃之。
然后想了一下在一个servlet中写了个定时器,让它每两小时查一下数据库,运行了几天发现问题仍然存在,将定时器间隔时间修改为30分钟、3分钟仍然无济于事,异常照常出现,弃之。
在网上搜了一下解决方案也挺多,把
<set-property property="testOnBorrow" value="true"/>
- <set-property property="validationQuery" value="select 1"/>
写入到配置文件中,运行报错,说bean中没有这两个属性,查看了一下原来是我用的c3p0连接池,而这个解决方案是针对DBCP连接池的。
最后在配置文件中,添加了
- <property name="maxIdleTime"value="1800"/>
成功解决了问题。
感悟,问题很简单,就是改个配置文件,但是遇到问题需要快速解决问题的能力,更需要认真的态度。
转载请注明本文地址: 使用DBCP连接池时出现MySql 8小时断开连接的解决方法