【问题标题】:I am getting pool error Timeout waiting for idle object我收到池错误超时等待空闲对象
【发布时间】:2013-12-22 11:13:23
【问题描述】:
  <Resource name="jdbc/name" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql:url?autoReconnect=true"/> 

我在Tomcat服务器中使用上述语句创建了连接池。

一些 android 应用程序正在使用 Web 服务与我的应用程序连接。通过 Web 服务,我正在发送和接收一些数据。 我收到错误

SQLState: null
[2013-12-05 14:13:06,156]ERROR069688[http-8080-10] - org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:78) -
 Cannot get a connection, pool error Timeout waiting for idle object

我看到了Connection Pool Exception: Cannot get a connection, pool error Timeout waiting for idle object

但我不知道。

这是什么原因。

提前谢谢...

【问题讨论】:

  • 能否请您发布您的服务器连接maxThread count,服务器级别的最大线程数与jdbc级别的比率是多少?

标签: spring tomcat


【解决方案1】:

此异常表明池管理器无法生成与等待请求者的可行连接,并且 maxWait 已通过因此触发超时。有多种潜在原因,但通常分为两大类:

  1. 数据库已关闭或无法访问。这可能是因为您忘记启动它,或者它崩溃了,或者您和数据库之间的网络已经停止工作。但基本上,池无法提供有效的新连接,因此请求者等待新连接的时间超过了超时时间并放弃了。这通常是不太可能的情况,因为发生这种情况时您通常会看到其他错误。

  2. 连接池(设置为 100 最大活动)连接不足。这可能是由于高需求量,也可能是连接泄漏的迹象,其中连接永远不会返回到池中,最终您超过了最大连接限制。这是更可能的原因...通常是由于在完成数据库资源后未关闭它们而导致的连接泄漏。

如果说数据库遇到查询停止执行的错误,有时 1 和 2 会创建此场景。当这种情况发生时,它就像连接泄漏,因为新连接出去并阻塞对数据库的查询并且永远不会被释放。最终,所有连接都处于活动状态,并且下一个请求连接的线程将被放入等待队列,因为没有更多的连接可以发出。由于数据库已被冲洗,您不会看到任何其他异常,直到第一个请求者在等待队列中超时。当 Oracle DB 后端崩溃时,我们偶尔会在使用 Oracle UCP 时看到这种情况。

我建议在发生这种情况时使用 JConsole 监控数据库池大小,并确定触发此错误的上述两种原因中的哪一种。然后,您可以尝试修复连接或操作池大小/超时参数以适应实际需求(您也可以在 Tomcat 中操作连接器参数以减少对应用程序的整体需求)。如果您在 Tomcat 中运行,您通常可以只运行 JConsole(位于 JDK bin 目录中)并附加到 tomcat 进程,然后只需查看 JMX 控制台以找到找到池大小的位置......通常取决于数据源类型(dbcp vs oracle ucp vs etc)。然后,您可以双击字段值来绘制它们,以便随着时间的推移跟踪它们。

此外,您可能需要在 Tomcat 中启用 JMX 才能使 JConsole JMX 监控工作。

【讨论】:

  • 我在使用hibernate。使用后是否需要关闭连接。我认为hibernate会处理它。
  • 根据您使用 Hibernate 的方式,它应该为您管理连接。但是,我仍然认为您需要调查我上面概述的潜在原因。如果它工作一段时间然后停止,那么它可能是泄漏。如果它在轻负载下工作但在重负载下中断,则可能是池大小。如果它永远无法正常工作,则可能是数据源连接设置不正确。无论如何,除非您尝试消除一些潜在的原因,否则您不会知道。
  • 如果你在休眠中使用事务,你不需要关闭连接。连接将在事务结束时关闭。
  • 我面临同样的问题。正如建议的那样,我将 Jconsole 连接到了 tomcat。我正在使用 java 5. 和 Tomcat 5。但是请建议我如何监控连接池到 jconsole 或任何此类指南或链接来帮助我弄清楚?
猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多