tomcat JDBC连接池c3p0连接资源耗尽导致tomcat实例对应的app移动端无法访问。

五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述tomcat JDBC连接池c3p0连接资源耗尽导致tomcat实例对应的app移动端无法访问。相关的知识,希望能为你提供帮助。
tomcat app手机端程序无法打开了。


直接查看tomcat日志:

[[email  protected]  logs]$  tail  catalina.out                  at  java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)                 at  org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)                 at  java.lang.Thread.run(Thread.java:748) Caused  by:  com.mchange.v2.resourcepool.TimeoutException:  A  client  timed  out  while  waiting  to  acquire  a  resource  from  [email  protected]  --  timeout  at  awaitAvailable()                 at  com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317)                 at  com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)                 at  com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)                 at  com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)                 ...  53  more



[[email  protected]  logs]$  cat  catalina.out ..........省略.................. java.sql.SQLException:  An  attempt  by  a  client  to  checkout  a  Connection  has  timed  out.        #报错问题关键 at  com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at  com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65) at  com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527) at  com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at  com.sunfo.data.ConnectionManager.getProcedureDSConnection(ConnectionManager.java:136) at  com.sunfo.data.dao.Database.executeProcedure(Database.java:652) at  com.sunfo.database.Dao$Procedures.pr_page(Dao.java:4990) at  com.sunfo.base.BaseService.dataPage(BaseService.java:39) at  com.sunfo.service.admin.AppInvitationDocService.queryAppInvitationDocPage(AppInvitationDocService.java:67) at  com.sunfo.index.controller.IndexController.invitation(IndexController.java:589) at  sun.reflect.GeneratedMethodAccessor193.invoke(Unknown  Source) at  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at  java.lang.reflect.Method.invoke(Method.java:498) at  org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at  org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) at  org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) at  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) at  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) at  org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at  org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) at  org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) at  org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at  org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) at  javax.servlet.http.HttpServlet.service(HttpServlet.java:620) at  org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at  javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at  org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at  org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at  org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at  org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) at  org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at  org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at  com.sunfo.system.filter.RequestParametersFilter.doFilter(RequestParametersFilter.java:44) at  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at  org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at  org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at  org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at  org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at  com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve.invoke(RedisSessionHandlerValve.java:26) at  org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at  org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at  org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at  org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at  org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at  org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at  org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at  org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) at  java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at  java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at  org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at  java.lang.Thread.run(Thread.java:748) Caused  by:  com.mchange.v2.resourcepool.TimeoutException:  A  client  timed  out  while  waiting  to  acquire  a  resource  from  [email  protected]  --  timeout  at  awaitAvailable() #报错问题关键 at  com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317) at  com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) at  com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) at  com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ...  51  more ..........省略..................

由于时间紧急,临时解决方法:重启tomcat服务后恢复
但是对应这个问题分析,已获取日志。
遇到这个问题应该进入数据库看连接池,当前连接哪些?然后针对于连接数分析每个连接。一般都是由于开发
写代码时候由bug,导致线程调取连接池的时候,发现当前没有可使用的连接池导致的。
也就是说,连接数里面的已用的连接数没有释放,连接池耗尽导致的。


【tomcat JDBC连接池c3p0连接资源耗尽导致tomcat实例对应的app移动端无法访问。】





对于这部分的异常分析如下:
网上很多说是C3P0的bug问题。c3p0在同时关闭statement和connection的时候,或者关闭他们之间的时间很短的时候,有时候connection并没有被关闭,因为有些preparedstatement还在被cached住。这样就会有很多connection并没有真正的被关闭,连接池的连接都给耗尽了,就会产生上面的异常。解决的方案就是把缓存关闭也就是把c3p0.max_statements 设置成0,这样就不会有缓存的preparedstatement,而设置的c3p0.idle_test_period又小于c3p0.timeout,这样的设置应该没有什么问题了。
回头有时间的话,再拜读下源码研究下,目前先这么解决即可.
参考文档:https://blog.csdn.net/t12x3456/article/details/7650404







    推荐阅读