2016-08-19 80 views
0

在我們的應用程序中,我們遇到了一個問題,即在某些hibernate查詢中,查詢花費的時間比平時更長(有時不完整)我們正在觀察與這些查詢相關的連接對象是打開的,但沒有關閉。 由於這種行爲,最終應用程序將耗盡連接並進入高CPU和堆利用率。Oracle JDBC連接緩存,連接長時間保持打開狀態,並最終無法關閉它

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) 

在這種情況下,你能否建議什麼樣的超時屬性更適合連接緩存。 按照JDBC文檔中,我們遇到了下列屬性,請幫助:

InactivityTimeout
TimeToLiveTimeout
AbandonedConnectionTimeout
編號:http://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm#CDEBCBJC

回答

1

請使用Oracle通用連接池的Java(UCP)的替代品對於已經在Oracle Database 12c中不支持的隱式連接緩存(ICC)。該文檔可在OTN上找到。

相關問題