【发布时间】:2017-09-22 10:56:02
【问题描述】:
有一个批处理作业如下所示:
@Transactional
public void myBatchJob() {
// retrieves thousands of entries and locks them
// to prevent other jobs from touthing this dataset
entries = getEntriesToProcessWithLock();
additional = doPrepWork(); // interacts with DB
processor = applicationContext.getBean(getClass());
while (!entries.isEmpty()) {
result = doActualProcessing(entries, additional); // takes as many entries as it needs; removes them from collection afterwards
resultDao.save(result);
}
}
但是,如果 entries 集合足够大,我偶尔会收到以下错误。
ORA-01000: 超出最大打开游标数
我决定将责任归咎于 doActualProcessing() 和 save() 方法,因为它们最终可能会在一次事务中创建数百个 blob。
显而易见的出路似乎是将处理拆分为多个事务:一个用于获取和锁定条目,另一个用于处理和持久化其他事务。像这样:
@Transactional
public void myBatchJob() {
// retrieves thousands of entries and locks them
// to prevent other jobs from touthing this dataset
entries = getEntriesToProcessWithLock();
additional = doPrepWork(); // interacts with DB
processor = applicationContext.getBean(getClass());
while (!entries.isEmpty()) {
processor.doProcess(entries, additional);
}
}
@Transactional(propagation=REQUIRES_NEW)
public void doProcess(entries, additional) {
result = doActualProcessing(entries, additional); // takes as many entries as it needs; removes them from collection afterwards
resultDao.save(result);
}
现在每当doProcess 被调用时,我都会得到:
原因:org.hibernate.HibernateException:非法尝试将代理与两个打开的会话关联
如何让HibernateTransactionManager 执行REQUIRES_NEW javadoc 建议的操作:暂停当前事务并开始新事务?
【问题讨论】:
标签: java spring hibernate jpa transactional