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

可能重复:
连接池exception:无法获取连接,池错误超时等待空闲对象

我收到无法获得连接,池错误超时等待空闲对象错误,当我尝试在我的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) 

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

也许你已经为“死”连接设置了超时,有些查询需要更长的时间 。 这意味着您的池从池中删除了一个忙碌的连接 “死”,并从数据库中请求另一个 – 直到DB拔出插件。

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

还检查你的mysql连接设置。 当你下次完成db coz(超出maxConnectionAge限制)时,尝试关闭连接 ,连接状态将会死亡

我以前遇到过这样的问题,你需要做的是
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 }