我在处理对象的创建或修改时遇到了一些问题,该对象在一个批中有一个子对象(可能是1000000个或更多个实体的集合)。
一开始,我尝试直接创建对象:
entite.getEntiteManager(session).createEntite(entite);
但是,的一个例外
maximum open cursors exceeded was thrown.
所以,我尝试了第二种方法:我首先创建父亲,然后按250的列表创建孩子,我影响父亲对他们的引用,而不是我承诺的。这就是现在的工作。
问题是:如果在创建子项的过程中出现了一些问题,那么它只会回滚wich面临问题的列表。其他人已经承诺了。
在这种情况下,Spring Batch对我有用吗。他对待这个问题吗。
Spring Batch的"分块"概念将支持您所描述的重试和失败场景。也就是说,您已经创建了500条记录,但出现了故障,您不想在重新启动时丢失现有的记录。
这种作业的简单配置可能如下所示;
<batch:job id="entityCreationJob">
<batch:step id="entityCreationJob.step1">
<batch:tasklet>
<batch:chunk reader="entityReader" writer="entityWriter" commit-interval="250"/>
</batch:tasklet>
</batch:step>
</batch:job>
这种简单的配置将执行以下操作;-"每行"读取/创建单个记录(entity.getEntityManager(session).createEntity(e))
-"提交"250个记录块中的记录(由提交间隔设置)
如果您有一个失败(比如说,在记录1190),提交间隔为250,那么您只会"丢失"190条记录的工作。之前的1000个已经提交到数据库中。当应用程序重新启动时,它将从1001条记录开始并继续,在250个记录块中提交。
为了充分利用commit/retry组件,我建议您使用JpaItemWriter
和JpaTransactionManager
或JTA事务管理器。