2015-04-23 169 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