Hibernate - 获取异常:超出最大进程数(550)

时间:2012-03-22 05:52:14

标签: oracle hibernate jdbc database-connection

我正在使用hibernate 3和spring.My Hibernate配置如下:

hibernate.dialect=org.hibernate.dialect.Oracle8iDialect
hibernate.connection.release_mode=on_close

但是在启动应用程序之后,即使只有一个用户访问它,我也会收到此异常:

ORA-00020: maximum number of processes (550) exceeded 

这是堆栈跟踪:

Caused by: java.sql.SQLException: ORA-00020: maximum number of processes (550) exceeded

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038)
    at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2037)

我保持连接池超时= 5000.我也试图找到原因并获得该释放模式可能会影响关闭数据库资源的机制。但我无法找到确切的解决方案。 请帮忙.. 提前谢谢..

1 个答案:

答案 0 :(得分:0)

这是数据库错误,而不是应用程序错误,因此您需要转到数据库来解决它。 550个过程比听起来要多得多,所以要么有人疯了,要么你有很多不活跃的进程在运行。

查找最佳方法是查询v$session视图或Gv$session如果您使用的是RAC,请查看STATUS列。

不要注意所有这些会议的来源; OSUSERTERMINALPROGRAM可能是最有用的。可能几乎值得创建一个包含此信息的临时表 - 证明和事后记录。然后在检查您不会破坏任何内容之后,如果您有任何内容,请与您的DBA一起,杀死所有非活动会话simultaneouslyone at a time

那将删除错误,但如果它再次发生就会发生,所以你需要解决它。之一:

  • 你们有很多人在使用这个数据库。
  • 有一个应用程序/程序在某个地方没有关闭它 会议结束后的会议。
  • 有人在循环中间连接。

无论你是什么原因,你需要追踪它并纠正它。我将从具有最多进程数的v$session的程序或终端开始。