尽管Oracle有足够的进程/会话,但它仍然没有连接

时间:2013-11-17 13:47:02

标签: oracle tomcat database-connection connection-pooling apache-commons-dbcp

我在Win 2008计算机上有一个相当高流量的Tomcat应用程序服务器,连接到Oracle Database 11.2.0.1.0(Windows Server 64x 2k8 R2; ~500-1000个唯一用户在一分钟内访问我的Web应用程序)。它适用于单个Tomcat,连接池settiong最多有40个连接(我正在使用DBCP)。

Oracle与Tomcat安装在同一台机器上。当我启动另一个Tomcat,并在两个Tomcats之间平衡用户时(它们绑定到不同的IP并且在DNS级别完成平衡),一个总是与以下堆栈跟踪不连接:

Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
    at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:71)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    ... 88 more
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:958)
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)

这很奇怪,因为我将'connections'和'sessions'参数设置为一个值,当我计算活动会话时,这个值甚至都不能满足。

Oracle processes参数为700 sessions为1216.当一个Tomcat脱离连接时,以下查询返回少于160个会话: SELECT COUNT(*) FROM v$session;

1 个答案:

答案 0 :(得分:0)

显然,等待从池中获得免费连接的时间已经过了。在第二个Tomcat的配置中仔细检查MaxActive设置的正确性。

如果您违反了Oracle(MaxProcesses和MaxSessions)中的限制,则会出现ORA-xxxxx错误。