Oracle JDBC连接缓存,连接长时间保持打开状态,最终无法关闭

Oracle JDBC连接缓存,连接长时间保持打开状态,最终无法关闭,oracle,caching,jdbc,timeout,Oracle,Caching,Jdbc,Timeout,在我们的应用程序中,我们面临一个问题,在某些hibernate查询中,查询比通常需要更长的时间(有时无法完成),并且当使用探查器进行分析时,我们发现与这些查询相关的连接对象是打开的,而不是关闭的。 由于这种行为,应用程序最终会耗尽连接并进入高CPU和堆利用率 java.lang.Thread.State: TIMED_WAITING at java.lang.Object.wait(Native Method) - waiting on <3a685292> (a oracl

在我们的应用程序中,我们面临一个问题,在某些hibernate查询中,查询比通常需要更长的时间(有时无法完成),并且当使用探查器进行分析时,我们发现与这些查询相关的连接对象是打开的,而不是关闭的。 由于这种行为,应用程序最终会耗尽连接并进入高CPU和堆利用率

    java.lang.Thread.State: TIMED_WAITING
at java.lang.Object.wait(Native Method)
- waiting on <3a685292> (a oracle.jdbc.pool.OracleImplicitConnectionCache)
at oracle.jdbc.pool.OracleImplicitConnectionCache.processConnectionWaitTimeout(OracleImplicitConnectionCache.java:2955)
at oracle.jdbc.pool.OracleImplicitConnectionCache.getConnection(OracleImplicitConnectionCache.java:374)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:374)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:178)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:156)
at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:403)
at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)
at com.sun.proxy.$Proxy75.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:161)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:159)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1854)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1831)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811)
at org.hibernate.loader.Loader.doQuery(Loader.java:899)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:311)
at org.hibernate.loader.Loader.loadEntity(Loader.java:2111)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3917)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:262)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1091)
at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:174)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2473)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:991)
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:271)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:913)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:897)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:901)
java.lang.Thread.State:定时等待
在java.lang.Object.wait(本机方法)
-等待(oracle.jdbc.pool.OracleImplicitConnectionCache)
在oracle.jdbc.pool.OracleImplicitConnectionCache.processConnectionWaitTimeout(OracleImplicitConnectionCache.java:2955)
在oracle.jdbc.pool.OracleImplicitConnectionCache.getConnection(OracleImplicitConnectionCache.java:374)
在oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:374)
在oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:178)中
在oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:156)中
位于org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:403)
位于org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)
在com.sun.proxy.$Proxy75.prepareStatement(未知来源)
位于org.hibernate.engine.jdbc.internal.StatementPrepareImpl$5.doPrepare(statementPrepareImpl.java:161)
位于org.hibernate.engine.jdbc.internal.StatementPrepareImpl$StatementPreparationTemplate.prepareStatement(statementPrepareImpl.java:182)
位于org.hibernate.engine.jdbc.internal.statementPrepareImpl.prepareQueryStatement(statementPrepareImpl.java:159)
位于org.hibernate.loader.loader.prepareQueryStatement(loader.java:1854)
位于org.hibernate.loader.loader.executeQueryStatement(loader.java:1831)
位于org.hibernate.loader.loader.executeQueryStatement(loader.java:1811)
位于org.hibernate.loader.loader.doQuery(loader.java:899)
在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:341)上
在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:311)上
位于org.hibernate.loader.loader.loadeEntity(loader.java:2111)
位于org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
位于org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
位于org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3917)
位于org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460)
位于org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429)
位于org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206)
位于org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:262)
位于org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
位于org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1091)
访问org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:174)
位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2473)
位于org.hibernate.internal.SessionImpl.get(SessionImpl.java:991)
位于org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:271)
位于org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)
位于org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
位于org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:913)
位于org.hibernate.internal.SessionImpl.merge(SessionImpl.java:897)
位于org.hibernate.internal.SessionImpl.merge(SessionImpl.java:901)
在这种情况下,您能否建议连接缓存最好使用哪种超时属性。 根据JDBC文档,我们遇到了以下属性,请提供帮助:

不活动超时
TimeToLiveTimeout
放弃连接超时

Ref:

请使用Oracle Universal Connection Pool for Java(UCP)替换Oracle Database 12c中不支持的隐式连接缓存(ICC)。文档可在上找到

请使用Oracle Universal Connection Pool for Java(UCP)替换Oracle Database 12c中不支持的隐式连接缓存(ICC)。文档可在上找到