我们的设置:Hibernate4,JPA,Oracle11g,OJDBC6版本11.2.0.2.0(与我们的Oracle DB版本相同)。
我们的上下文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"/>
尝试运行相当简单的更新和插入操作,每行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)
最佳答案
解决了这一问题,事实证明,团队中的某些成员没有提交他们在SQL Developer中所做的更改,因此表中有一个锁,导致插入失败。
我想知道是否有一种更好的日志记录方式可以使问题更加清楚。
但是,感谢您阅读我的问题:-)。