Tomcat7 JDBC放弃了PooledConnection

时间:2014-02-24 12:01:40

标签: java oracle hibernate tomcat

我们的设置:Hibernate4,JPA,Oracle11g,OJDBC6版本11.2.0.2.0 [与我们的Oracle数据库版本相同]。

我们的上下文bean:

<Resource name="jdbc/DataSource"
        type="javax.sql.DataSource"
        auth="Container"
        username=""
        password=""
        driverClassName="oracle.jdbc.OracleDriver"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        url="jdbc:oracle:thin:@ip:1521:sid"
        maxActive="50"
        maxIdle="10"
        minIdle="5"
        suspectTimeout="60"
        timeBetweenEvictionRunsMillis="30000"
        minEvictableIdleTimeMillis="60000"
        removeAbandonedTimeout="60"
        removeAbandoned="true"
        logAbandoned="true"
        testOnBorrow="true"
        testWhileIdle="true"
        testOnReturn="false"
        validationQuery="SELECT 1 FROM DUAL"
        validationInterval="30000"
        jmxEnabled="false"
        jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"
        connectionProperties="v$session.program=dev-cs"/>

尝试运行相当简单的更新&amp; insert,curreny 121行每个,偶尔会有8000行。

for (int i = 0; i < bUpdated.size(); i++) {
   entityManager.merge(bUpdated.get(i));
   entityManager.persist(pInserted.get(i));
   if(i % 50 == 0) {
      entityManager.flush();
   }
}
entityManager.flush();

我在连接设置上尝试了不同的旋转,删除了放弃的超时等,并查看了jar。

使用showSql = true,我们看到在更新之前我们做了大量的选择。插入工作正常,但在第一次刷新后抛出连接放弃错误[您可以看到单个插入到数据库中]。

编辑:抱歉,应该包含stacktrace:

WARNING: Connection has been abandoned PooledConnection[oracle.jdbc.driver.T4CConnection@1359bbfb]:java.lang.Exception
            at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1063)
            at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:780)
            at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:619)
            at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
            at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
            at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)
            at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
            at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297)
            at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
            at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
            at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
            at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1395)
            at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:59)

1 个答案:

答案 0 :(得分:0)

它已经解决,但事实证明团队的某些成员没有提交他们在SQL Developer中所做的更改,因此表中有一个锁定,表明插入失败了。 我想知道是否有一种更好的伐木方式可以使问题更加清晰。

但感谢任何关于我的问题的读物: - )。