我在处理批量对象的创建或修改时遇到一些问题,该对象有一个子对象(实体的集合(可能是 1000000 或更多))。
一开始,我尝试直接创建对象:
entite.getEntiteManager(session).createEntite(entite);
但是,有一个异常(exception):
maximum open cursors exceeded was thrown.
所以,我尝试了第二种方法:我首先创建父亲,然后通过 250 个列表创建 child ,然后影响父亲对他们的引用,而不是我提交。现在就是工作了。
问题是:如果在创建子项期间出现一些问题,那么它只会回滚遇到问题的列表。其他人已经 promise 了。
在这种情况下 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 个记录 block 中“提交”记录(由提交间隔设置)
如果发生故障(假设在记录 1190 处),提交间隔为 250,您只会“丢失”190 条记录的工作。前 1000 个已提交至数据库。当应用程序重新启动时,它将在 1001 条记录处获取并继续,提交 250 条记录 block 。
为了充分利用提交/重试组件,我建议您使用 JpaItemWriter
和 JpaTransactionManager
或 JTA 事务管理器。
关于java - 处理一个对象的创建,该对象有一个子对象(〜实体的集合可能有 1000000 或更多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408705/