Java 当我尝试在web应用程序中创建250多个线程时,我发现无法获得连接,池错误等待空闲对象超时
可能重复:Java 当我尝试在web应用程序中创建250多个线程时,我发现无法获得连接,池错误等待空闲对象超时,java,mysql,hibernate,Java,Mysql,Hibernate,可能重复: 当我尝试在我的web应用程序中创建250多个线程时,我发现无法获得连接,池错误等待空闲对象错误超时。我正在使用JSF2.0和Hibernate创建web应用程序 我尝试过修改hibernate.xml、server.xml、context.xml和mysql属性 以下是我得到的信息。 WARN (JDBCExceptionReporter.java:233) - SQL Error: 0, SQLState: null ERROR (JDBCExceptionReporter.ja
当我尝试在我的web应用程序中创建250多个线程时,我发现无法获得连接,池错误等待空闲对象错误超时。我正在使用JSF2.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)
如果您对此有任何想法,请帮助我……我以前遇到过这样的问题,您需要做的是
完成后关闭休眠会话。
e、 g
可能您已经为“死”连接设置了超时,有些查询需要的时间要比这个时间长。这意味着您的池将一个繁忙连接作为“死”从池中删除,并从数据库请求另一个连接,直到数据库拔出插头 若要对此进行调试,为连接池启用日志记录,以便您可以看到它何时请求新连接
同时检查您的mysql连接设置。下次使用dbcoz时,请尝试关闭连接(超出
maxConnectionAge
限制)该连接状态将为“死”你好,谢谢你的回复。你好,谢谢我的问题通过context.xml文件中的更改得到了解决。我已经更改了context.xml.file maxActive=“-1”maxIdle=“-1”maxWait=“-1”-1表示没有限制。@Ganesh请发布你的答案,如果你自己解决了这个问题,或者不管哪个答案对你有帮助,都要把它标记为已被接受。祝你好运:)@Ganesh有一件事你不应该这样做,它会使你的连接休眠,正如我建议的,打开连接工作关闭连接这个问题是由协议时间延迟引起的。我调试并解决了协议问题,之后我就不会得到那个异常了。
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
}