JDBC连接池的问题。 请问在什么情况下,会出现这种问题啊? 找了好久,找不到原因......
警告: Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@5ebeda8]:java.lang.Exception
at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1023)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:752)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:600)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:179)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
at com.smartererp.common.db.BaseDao.getConn(BaseDao.java:71)
at com.smartererp.cos.biz.order.OrderDAO.generateMakeorderSyncInfo(OrderDAO.java:823)
at com.smartererp.cos.biz.order.OrderManager.makeOrder(OrderManager.java:54)
at com.smartererp.cos.ui.order.OrderFacade.makeOrder(OrderFacade.java:40)
at pc.PC001Action._btnMusterPass(PC001Action.java:78)
at pc.PC001Action.execute(PC001Action.java:25)
at com.needtool.jdf.TemplateAction.doprocess(TemplateAction.java:64)
at com.needtool.jdf.DispatchServlet.processRequest(DispatchServlet.java:190)
at com.needtool.jdf.DispatchServlet.doPost(DispatchServlet.java:306)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.needtool.jdf.CommonFilter.doFilter(CommonFilter.java:21)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722) 展开
你指的是JDBC连接池连接超时失效问题的问题吧?
这是因为mysql默认保持连接的时间是8小时,如果这个连接在8小时内无人访问的话,就会关闭这个连接。但是连接池设计的时候没有考虑到这个问题,还把失效的连接拿出去就会导致出现异常。
解决方法:
1、创建一个线程每隔一段时间就测试一下连接,保持连接时最新的,永远达不到8小时无人访问。
2、连接池取连接的时候判定是否这个连接有效。
[java] view plain copy
if (conn.isValid(1000)){
return conn;
}
else{
return this.CreateConnection();
}
3、不使用连接池,直接拿了就用,用了就还。
连接池的概念:
用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
JDBC数据库连接池接口(DataSource):
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
这种情况我看应该修改一下jdbc连接池的配置。添加如下配置:
removeAbandoned:true
removeAbandonedTimeout:120
testOnBorrow:true
logAbandoned:true
已经好了,谢谢啊。
把解决问题的方法贴出来,以方便后来人