【问题标题】:tomcat died after running well for a whiletomcat跑好一阵子就死了
【发布时间】:2016-03-13 17:30:30
【问题描述】:

我有 2 台 tomcat 服务器在同一台机器上运行,它们都访问另一台机器上的同一个数据库。

Tomcat 7.0.37 with spring 4.1.6 (MVC, jdbc, framework), and MySQL 5.5.13. 

tomcat 网络服务器可以正常运行几个小时,直到它突然死机而没有响应。

我必须手动终止该进程,因为 bin/shutdown.sh 无效。

当 tomcat1 死了,tomcat2 仍然可以正常工作...

我尝试过的事情:

1 increased the c3p0 max_connections from 50 to 100
2 change tomcat to NIO mode

会尝试:

replace c3p0 with HikariCP;

这是来自 catalina.out 的日志:

2015-12-07 22:13:55,899 ERROR [com.yd.api.controller.YDTagController] - <org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.>
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:772)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:211)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:226)
    at com.yundong.api.dao.impl.YDTagDaoImpl.getUploaderCount(YDTagDaoImpl.java:587)
    at com.yundong.api.service.impl.YDTagServiceImpl.getUploaderCount(YDTagServiceImpl.java:373)
    at com.yundong.api.controller.YDTagController.searchActivityphotoByTag(YDTagController.java:385)
    at sun.reflect.GeneratedMethodAccessor279.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    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:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    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:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: 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 org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 49 more
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@d1003e1 -- 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)
    ... 52 more

【问题讨论】:

  • 你读过前几行吗?弄清楚你的数据库发生了什么...
  • @MarcB 感谢您的格式化。 mysql 数据库运行良好,因为另一个应用程序正在访问同一个表。
  • 您的堆栈跟踪中没有任何事务相关(我希望TransactionInterceptor。如果没有事务分界,您可能会遇到池饥饿问题(即未返回池的连接)。接下来我不再使用 C3P0 我强烈建议改用 HikariCP 之类的池。
  • @M.Deinum 我们决定转移到 HikariCP 并稍后再试

标签: java mysql tomcat jdbc c3p0


【解决方案1】:

看起来一个进程在等待新的 sql 连接时卡住了。

  • 确保您为所有服务器配置了连接和套接字超时 你的 sql 连接。

  • 确保所有连接、语句和结果集 java中的对象在使用后关闭(close方法在finally中调用 块)。

【讨论】:

  • 不需要在我的代码中处理“关闭”,因为 spring 为我处理 jdbc 相关问题
【解决方案2】:

如果您在本地处理数据库,则可以检查超时设置并修改它们以应对请求调用的延迟。

如果您正在处理远程 DB m/c,则需要保持一致的连接。如果您不确定如何使您的机器与数据库机器的连接保持一致,请编写一个简单的批处理脚本来 ping 数据库服务器并保持连接处于活动状态,以便您的应用程序发送请求。

【讨论】:

  • 我有 2 个应用程序在同一个 Web 服务器上运行,它们都访问同一个数据库服务器。随着 tomcat1 死掉,tomcat2 运行良好……
  • 所以这绝对是您的应用程序中的连接问题。确保正确关闭它们。
  • 能否请您提供有关超时设置的更多信息?
【解决方案3】:

这完全是数据库问题,不是 Tomcat。当您为数据库设置的参数达到其最大利用率并且没有更多可用参数时,数据库崩溃。

在高峰期检查您的进程和会话参数利用率,并根据它们的最大利用率进行设置 * 5

【讨论】:

  • 但我有 2 个应用程序在同一个 Web 服务器上运行,它们都访问同一个数据库服务器。随着 tomcat1 死掉,tomcat2 运行良好……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多