gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:35:40 26 4
gpt4 key购买 nike

我在处理批量对象的创建或修改时遇到一些问题,该对象有一个子对象(实体的集合(可能是 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 。

为了充分利用提交/重试组件,我建议您使用 JpaItemWriterJpaTransactionManager 或 JTA 事务管理器。

关于java - 处理一个对象的创建,该对象有一个子对象(〜实体的集合可能有 1000000 或更多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com