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

标签 java oracle jpa eclipselink spring-batch

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

相关文章:

java - java中如何自动重命名对象

Java:Swing:设置JButton的位置

启动其他 session 的跟踪时出现 Oracle 11g 错误

java - JPA 关系实体在数据库上更新,但不在现场更新

jpa - Spring Data JPA 和 NamedEntityGraphs

从 Jmenu 中选择项目并单击按钮时出现 java.lang.NullPointerException

java - Eclipse JDT 编译器 (ECJ) 在 Java 1.7 中抛出 NPE

python oracle SQL查询转换

sql - oracle sql developer 编辑字段

java - Spring-Boot 中的多个数据库与 mariaDB