我正在使用Oracle UCP(通用连接池)。在处理了大约100K条记录后,我得到了以下错误。
oracle.ucp.UniversalConnectionPoolException: Invalid life cycle state. Check the status of the Universal Connection Pool
at oracle.ucp.util.UCPErrorHandler.newSQLException(UCPErrorHandler.java:488) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.util.UCPErrorHandler.throwSQLException(UCPErrorHandler.java:163) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:943) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:873) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:863) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
Caused by: oracle.ucp.UniversalConnectionPoolException: Invalid life cycle state. Check the status of the Universal Connection Pool
at oracle.ucp.util.UCPErrorHandler.newUniversalConnectionPoolException(UCPErrorHandler.java:368) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.util.UCPErrorHandler.throwUniversalConnectionPoolException(UCPErrorHandler.java:49) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.util.UCPErrorHandler.throwUniversalConnectionPoolException(UCPErrorHandler.java:80) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.util.UCPErrorHandler.throwUniversalConnectionPoolException(UCPErrorHandler.java:131) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionWithoutCountingRequests(UniversalConnectionPoolImpl.java:304) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnectionAndValidate(UniversalConnectionPoolImpl.java:168) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.common.UniversalConnectionPoolImpl.borrowConnection(UniversalConnectionPoolImpl.java:143) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.jdbc.JDBCConnectionPool.borrowConnection(JDBCConnectionPool.java:157) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:931) ~[ucp-11.2.0.3.0.jar:11.2.0.3.0]
... 15 more
下面是创建数据源
的代码片段PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource();
dataSource.setURL("jdbc.url"));
dataSource.setUser("jdbc.user"));
dataSource.setPassword("jdbc.password"));
dataSource.setMaxConnectionReuseCount(100);
dataSource.setInitialPoolSize(50);
dataSource.setMinPoolSize(50);
dataSource.setMaxPoolSize(100);
dataSource.setValidateConnectionOnBorrow(true);
dataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
然后我从数据源获取连接作为
datasource.getConnection();
在我的情况下,我使用了错误的密码:|
在我的例子中,我在tomcat应用程序的例行升级过程中遇到了这个异常。当尝试与Oracle数据库交互时(因此从UniversalConnectionPool获得连接),应用程序一直得到此异常。
在阅读了UniversalConnectionPool (overview-using-ucp-manager)之后,我在一些Oracle文档中发现了这一行:如果应用程序试图启动先前已启动的池,或者池处于非停止或失败的状态,则会发生生命周期状态异常;这是我能找到的与此异常相关的最接近的东西了。
我最终发现我的构建配置中的一个错误意味着我有一个OJDBC驱动程序放在我的应用程序和Tomcat外部,不知怎么的,这些驱动程序同时与我的数据源和UCP交互,导致最后初始化的那个给出这个错误。从我的应用程序的类路径中删除OJDBC驱动程序修复了这个问题。