处理一个对象的创建,该对象有一个子对象(~可能有1000000个或更多实体的集合)



我在处理对象的创建或修改时遇到了一些问题,该对象在一个批中有一个子对象(可能是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组件,我建议您使用JpaItemWriterJpaTransactionManager或JTA事务管理器。

最新更新