Spring 我在等待空闲对象时收到池错误超时

Spring 我在等待空闲对象时收到池错误超时,spring,tomcat,Spring,Tomcat,我看见了 但我不知道 原因是什么 提前感谢…此异常表示池管理器无法生成到等待请求者的可行连接,并且maxWait已通过,因此触发超时。有几种潜在原因,但通常分为两大类: 数据库已关闭或无法访问。这可能是因为您忘记启动它,或者它崩溃,或者您与数据库之间的网络停止工作。但基本上,池无法提供有效的新连接,因此请求者等待新连接的时间超过了超时时间,并已放弃。这通常是不太可能发生的情况,因为发生这种情况时,您通常会看到其他错误 连接池(设置为100 max active)没有连接。这可能是由于高需求量造成

我看见了

但我不知道

原因是什么


提前感谢…

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

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

  • 连接池(设置为100 max active)没有连接。这可能是由于高需求量造成的,也可能是连接泄漏的迹象,即连接从未返回到池中,最终超出了最大连接限制。这是更可能的原因。。。通常是由于使用完数据库资源后未关闭它们而导致连接泄漏

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

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


    另外,您可能需要在Tomcat中启用JMX,以便JConsole JMX监控正常工作。

    我正在使用hibernate。使用后是否需要关闭连接。我认为hibernate会处理好它。根据您使用hibernate的方式,它应该为您管理连接。但是,我仍然认为您需要调查我上面概述的潜在原因。如果它工作了一段时间,然后停止,那么可能是泄漏。如果它在轻负载下工作,但在重负载下会断开,则可能是池的大小。如果它不起作用,可能是数据源连接设置不正确。无论如何,在您试图消除某些潜在原因之前,您不会知道。如果您使用hibernate事务,则无需关闭连接。连接将在交易结束时关闭。我面临同样的问题。按照建议,我将Jconsole连接到tomcat。我正在使用Java5。还有Tomcat 5。但是请建议我如何监控连接池到jconsole或任何这样的指南或链接,以帮助我弄清楚。您可以发布您的服务器连接maxThread计数吗?服务器级别和jdbc级别的最大线程数之间的比率是多少?
      <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"/> 
    
    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