【问题标题】:I am getting Cannot get a connection, pool error Timeout waiting for idle object, When I try to create more than 250 threads in my web application [duplicate]当我尝试在我的 Web 应用程序中创建超过 250 个线程时,我收到无法连接,池错误超时等待空闲对象 [重复]
【发布时间】:2012-07-28 21:45:29
【问题描述】:

可能重复:
Connection Pool Exception: Cannot get a connection, pool error Timeout waiting for idle object

当我尝试在我的 Web 应用程序中创建超过 250 个线程时,我收到无法连接,池错误超时等待空闲对象错误。我正在使用 JSF 2.0 和 Hibernate 创建 Web 应用程序。

我尝试过修改 hibernate.xml、server.xml、context.xml 以及 mysql 属性。

以下是我得到的。

WARN (JDBCExceptionReporter.java:233) - SQL Error: 0, SQLState: null
ERROR (JDBCExceptionReporter.java:234) - Cannot get a connection, pool error Timeout waiting for idle object
ERROR (BaseServlet.java:301) - ******** java.lang.Thread.getStackTrace(Thread.java:1426)
    Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
    org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    sun.reflect.GeneratedMethodAccessor378.invoke(Unknown Source)
    Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
    org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
    org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:92)
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    sun.reflect.GeneratedMethodAccessor378.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
    org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1144)
    org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
    org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:92)
    org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    sun.reflect.GeneratedMethodAccessor378.invoke(Unknown Source)

如果对此有任何想法,请帮助我......

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    我之前也遇到过这样的问题,你需要做的是
    close hibernate sessions when you are done with it.

    例如

    Session sess = factory.openSession();
     Transaction tx;
     try {
         tx = sess.beginTransaction();
         //do some work
         ...
         tx.commit();
     }
     catch (Exception e) {
         if (tx!=null) tx.rollback();
         throw e;
     }
     finally {
         sess.close(); // closing session
     }
    

    【讨论】:

      【解决方案2】:

      也许您已为 “死” 连接设置了超时,而某些查询需要 更长 的时间。这意味着您的 池将一个繁忙的连接作为“死”从池中移除,并从 DB 请求另一个 - 直到 DB 拔掉插头。

      要对此进行调试,请为您的连接池启用日志记录,以便您可以看到它何时请求新连接。

      还要检查您的 mysql 连接设置。并在下次完成 db 后尝试关闭连接(超出maxConnectionAge 限制)连接状态将变为 dead

      【讨论】:

      • 您好,感谢您的回复。
      • 嗨,谢谢我通过更改 context.xml 文件解决了我的问题 我已经更改了 context.xml.file 中的以下属性 maxActive="-1" maxIdle="-1" maxWait="-1" - 1 表示没有限制。
      • @Ganesh 如果您自己解决了问题,请发布您的答案,或者标记为接受任何对您有帮助的答案。祝你好运:)
      • @Ganesh 你不应该这样做的一件事,它会让你的连接休眠,因为我建议打开连接工作关闭连接
      • 这个问题是由于协议时间延迟而发生的。之后我调试并解决了该协议问题,但没有收到该异常。
      猜你喜欢
      • 2013-12-22
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2013-10-01
      • 2016-04-09
      • 1970-01-01
      相关资源
      最近更新 更多