Hello experts,
We have Apex 20 configured with ORDS behind Apache Tomcat.
ORDS is configured as follows :
<entry key="jdbc.DriverType">thin</entry>
<entry key="jdbc.InactivityTimeout">3000</entry>
<entry key="jdbc.InitialLimit">40</entry>
<entry key="jdbc.MaxConnectionReuseCount">10000</entry>
<entry key="jdbc.MaxLimit">40</entry>
<entry key="jdbc.MaxStatementsLimit">100000</entry>
<entry key="jdbc.MinLimit">40</entry>
<entry key="jdbc.statementTimeout">900</entry>
We perform some stress tests on our application. And as of a certain number of concurrent users, we start getting the error :
Caused by: oracle.dbtools.common.jdbc.ConnectionPoolConfigurationException: ORDS was unable to make a connection to the database. This can occur if the database is unavailable, the maximum number of sessions has been reached or the pool is not correctly configured. The connection pool named: |apex|pu| had the following error(s): Exception occurred while getting connection: oracle.ucp.UniversalConnectionPoolException: All connections in the Universal Connection Pool are in use - [ 40, 40, 40, 0, 0, 40, 10, 0, 39 ]
at oracle.dbtools.common.jdbc.ConnectionPoolExceptions.from(ConnectionPoolExceptions.java:47)
at oracle.dbtools.common.jdbc.DataSourceConnection.getPooledConnection(DataSourceConnection.java:220)
at oracle.dbtools.common.jdbc.DataSourceConnection.getPooledConnection(DataSourceConnection.java:186)
at oracle.dbtools.common.jdbc.DataSourceConnection.getDefaultConnection(DataSourceConnection.java:144)
at oracle.dbtools.common.jdbc.DataSourceConnection.getConnection(DataSourceConnection.java:58)
at oracle.dbtools.common.pools.DataSourceTargetImpl.getConnection(DataSourceTargetImpl.java:57)
at oracle.dbtools.common.config.db.SchemaConnectionFactoryBase.inject(SchemaConnectionFactoryBase.java:69)
at oracle.dbtools.url.mapping.db.PoolInjector.inject(PoolInjector.java:58)
... 67 more
Caused by: java.sql.SQLException: Exception occurred while getting connection: oracle.ucp.UniversalConnectionPoolException: All connections in the Universal Connection Pool are in use - [ 40, 40, 40, 0, 0, 40, 10, 0, 39 ]
at oracle.ucp.util.UCPErrorHandler.newSQLException(UCPErrorHandler.java:489)
at oracle.ucp.util.UCPErrorHandler.throwSQLException(UCPErrorHandler.java:166)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1863)
at oracle.ucp.jdbc.PoolDataSourceImpl.access$300(PoolDataSourceImpl.java:220)
at oracle.ucp.jdbc.PoolDataSourceImpl$3.build(PoolDataSourceImpl.java:3980)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1786)
at oracle.dbtools.common.ucp.PoolDataSourceDelegate.getConnection(PoolDataSourceDelegate.java:107)
at oracle.dbtools.common.config.db.RefreshablePoolDataSource.getConnection(RefreshablePoolDataSource.java:109)
at oracle.dbtools.common.ucp.PoolDataSourceDelegate.getConnection(PoolDataSourceDelegate.java:107)
at oracle.dbtools.common.ucp.PoolDataSourceDelegate.getConnection(PoolDataSourceDelegate.java:94)
at oracle.dbtools.common.jdbc.DataSourceConnection.getPooledConnection(DataSourceConnection.java:210)
... 73 more
Caused by: oracle.ucp.UniversalConnectionPoolException: All connections in the Universal Connection Pool are in use - [ 40, 40, 40, 0, 0, 40, 10, 0, 39 ]
at oracle.ucp.util.UCPErrorHandler.newUniversalConnectionPoolException(UCPErrorHandler.java:369)
at oracle.ucp.util.UCPErrorHandler.throwUniversalConnectionPoolException(UCPErrorHandler.java:59)
at oracle.ucp.util.UCPErrorHandler.throwUniversalConnectionPoolException(UCPErrorHandler.java:99)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionWithoutCountingRequests(UniversalConnectionPoolImpl.java:381)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionAndValidateHelper(UniversalConnectionPoolImpl.java:199)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionAndValidate(UniversalConnectionPoolImpl.java:156)
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnection(UniversalConnectionPoolImpl.java:129)
at oracle.ucp.jdbc.JDBCConnectionPool.borrowConnection(JDBCConnectionPool.java:175)
at oracle.ucp.jdbc.oracle.OracleJDBCConnectionPool.borrowConnection(OracleJDBCConnectionPool.java:601)
at oracle.ucp.jdbc.oracle.OracleConnectionConnectionPool.borrowConnection(OracleConnectionConnectionPool.java:109)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:1843)
... 81 more
I would like to know please whether it's possible to configure ORDS or Tomcat such that once all connections in the Universal Connection Pool are in use, not to send the response Not Found. But wait until a connection is available to perform the required action. Even if the request will take a long time.
Is that possible please ?
Thanks.