2015-04-23 212 views
0

下面是我的DBCP連接池的配置,DBCP連接池

<property name="maxWait" value="30000"/> 
<property name="maxActive" value="100"/> 
<property name="minIdle" value="0"/> 
<property name="minEvictableIdleTimeMillis" value="60000"/> 
<property name="defaultAutoCommit" value="true"/> 
<property name="validationQuery" value="select sysdate from dual" /> 
<property name="testOnBorrow" value="true" /> 
<property name="tryRecoveryInMinutes" value="0.25" /> 

但我得到下面的異常在線程轉儲文件。

"mythread-10444" prio=10 tid=0x00007ff098de9800 nid=0x77c runnable [0x00007ff0fd289000] 
    java.lang.Thread.State: RUNNABLE 
    at oracle.jdbc.driver.T2CStatement.t2cParseExecuteDescribe(Native Method) 
    at oracle.jdbc.driver.T2CStatement.executeForDescribe(T2CStatement.java:703) 
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296) 
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1498) 
    - locked <0x00000000e434a3c0> (a oracle.jdbc.driver.T2CConnection) 
    at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406) 
    at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208) 
    at org.apache.commons.dbcp.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:658) 
    at org.apache.commons.dbcp.PoolableConnectionFactory.validateObject(PoolableConnectionFactory.java:635) 
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1165) 
    at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79) 
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 

最初它工作正常,但一段時間後,我的應用程序完全掛起。你能不能讓我知道是什麼問題?

回答

0

異常明確指出,你的主題是仍然運行,您的連接是鎖定雖然這是忙於執行一個查詢。

at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1498) 
    - locked <0x00000000e434a3c0> (a oracle.jdbc.driver.T2CConnection) 

我關心的將是找出哪些查詢在該執行長(前超時),並對其進行優化。根據異常堆棧跟蹤,您正在執行一個DESCRIBE,Oracle RDMS對該查詢具有鎖定,並且在嘗試運行其他查詢時仍然執行該操作。

+0

我不知道哪個查詢需要花費太多時間。所有都只是一些小的查詢而已。一段時間後,它不會將任何查詢請求傳遞給數據庫。掛起來。 – Srinivasan

+0

請求您的數據庫管理員確定RDBMS執行的所有查詢並查看導致問題的原因。 –

0

考慮到Spring環境,您是否在Spring配置XML中正確定義了事務管理器bean?

<!-- Spring transaction manager --> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf" /> 
    </bean> 

    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

<!-- Spring transaction management per transactional-annotation --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

在我的球隊,我們也有類似的問題,在幾個星期前,沒有注意到,這部分是由我們的Spring XML註釋包裹。結果一堆交易從來沒有在數據庫前面被提交過。希望這可以幫助。

+0

前幾天工作正常,沒有任何問題。之後,連接掛起或未從池中獲取連接。 – Srinivasan

+0

您可以嘗試使用JConsole來跟蹤應用程序的JVM進程中的資源。也許這可以幫助你瞭解發生了什麼。看起來你的應用程序線程正在等待數據庫響應。某種表鎖?另一種方法可能是使用C3P0連接池而不是hibernate的內置池。有時候這有幫助。 – pklndnst