在批处理中,我使用Hibernate的StatelessSession插入和更新方法来添加或更新数据库中的对象,而不考虑任何上下文。
但是我注意到,对于大型数据集,它通常会因此错误而失败:
2017-10-18 01:39:46,263 [main] ERROR o.h.e.j.b.i.BatchingBatch - HHH000315:异常执行批处理[批量更新意外返回 更新行计数[1];实际行数:0;预期:1] org.hibernate.StaleStateException:批量更新返回意外 更新行计数[1];实际行数:0;预期:1 在org.hibernate.jdbc.Expectations $ BasicExpectation.checkBatched(Expectations.java:81) 在org.hibernate.jdbc.Expectations $ BasicExpectation.verifyOutcome(Expectations.java:73) 在org.hibernate.engine.jdbc.batch.internal.BatchingBatch.checkRowCounts(BatchingBatch.java:133) 在org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:110)
对象存储在Set中。当它达到100个元素时,这些元素将插入数据库中:
for (TempBuyingConditionBO tempBO:pager) {
contextStatelessSession.insert(tempBO);
insertedElements++;
}
commitBatch();
commitBatch定义:
public void commitBatch() {
try {
contextTransaction.commit();
} catch (HibernateException e) {
if (contextTransaction != null) {
contextTransaction.rollback();
}
getLog().error(e.getMessage());
}
contextTransaction = contextStatelessSession.beginTransaction();
}
插入超过3000个对象后,它会随机失败。
由于插入的数据正确,它看起来不像功能问题。我检查了hibernate映射,没有看到任何可以解释这个错误。
可能需要刷新先前插入的对象或使用"有状态的"会话?
有什么想法吗?