当前位置: 首页 > 知识库问答 >
问题:

如何在Spring批处理中使用itemWriter编写子记录

景凌
2023-03-14

我的情况:

我在readerItem中从db读取了类A。然后我需要处理这个类A并创建我在item处理机中做的类B。最后,我将这个类B保存到itemWriter中的db中。

问题:在处理过程中,我还需要创建具有类B外键的类C(约1 mil记录)并保存该类C。

我不能做这样的事情:因为正如我写的,我有大约100万条记录,我需要在内存中存储大约2gb的空间。所以我应该如何解决这个问题。

public class BWriter extends BaseItemWriter<B> {

    public void write(List<? extends B> data) throws Exception {
        logger.info("Start writing: " + data);
        for (B item : data) {
            myCustomDao.saveB(item);
            for (C itemC : item.getC()) {
                itemC.setB(item);
                myCustomDao.saveC(itemC);
            }
        }
    }
}

更新:

可能的解决方案不包括我想要的Spring批次:

    List<C> cList = new ArrayList<C>();
    int i = 0;
    String line;
    while ((line = reader.readLine()) != null) {
        String[] data = line.split(";");
        if (data.length > 1 && !StringUtils.isBlank(data[1])) {
            C cItem = new C();
            cItem.set(...);
            cList.add(i, cItem);
            if (++i >= 1000) {
                myCustomDao.save(cList);
                cList = new ArrayList<C>();
                i = 0;
            }
        }
    }
  if (!cList.isEmpty())
                myCustomDao.save(cList);

共有1个答案

从智志
2023-03-14

如果在not a选项中将commit interval减少到一个较小的值,因为一个B元素最多可以有1mil C对象,您可以这样做:

处理类A到类B,而不在处理的B对象中创建C对象;
BWriter中附加一个ItemWriteListener

如果问题是由于使用Hibernate而不是普通的JDBC造成的,您可以考虑手动使用无状态会话或flush()/clear()会话;1数据库的mil record不是一个大数字
不幸的是,当您有大量数据时,ORM不是最佳选择。

我的2美分,我和你一样是Spring批的新手。

 类似资料:
  • 我正在尝试在没有项目编写器的情况下使用下面的配置来配置spring批处理步骤。然而,我错误地说writer元素既没有'writer'属性,也没有元素。 我浏览了链接spring批处理:没有ItemWriter的Tasklet。但无法解决问题。有人能告诉我在我提到的代码片段中要做的具体更改吗

  • 我有一个假问题。为了解释我的用例,我有不同类型的DAO;比如说啤酒。。。等等,我想用一个通用的ItemWriter来处理所有的问题。我创建了一个,在这里我定义了; 作家班是这样的; 到目前为止一切都还好。事情变得复杂的地方是,我为每个存储库定义了单独的配置类,其中定义了存储库特定的项。例如,为用户插入数据库的步骤。 当我用IJ编写这段代码时,我抱怨

  • 我有一个Spring批导入流程,它有以下步骤: 读取特定格式的文件 保存人员、属性和约会的数据(每个文件行可以表示对多个表进行多次插入) 写入结果文件(主要是读取的结果,但有时我们无法将读取的数据处理成可以连贯插入的内容) 我目前在一组阅读器中有#1(每个文件格式一个),在单个Writer类中有#2和#3。我感觉写入结果文件应该是与将数据写入数据库分开的一个步骤,但我不确定如何做到这一点。 ste

  • 我在没有ItemWriter的情况下定义了我的tasklet,如下所示: 我得到了这个错误: 配置问题:

  • 我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?

  • 我从某个时候起就被这个问题困扰着。 我使用的是spring batch 3.0.7 问题是在ItemWriter中的一个记录中出现org.springframework.dao.DataIntegrityViolationExcue的情况下,组块(组块大小=10)中的其余记录也不会插入到数据库中,即使在提供了skipPolicy之后(对于所有异常返回true)。 我的理解是,如果在提交整个大块时出