【问题标题】:How to write child record using itemWriter in spring batch如何在春季批处理中使用 itemWriter 编写子记录
【发布时间】:2013-08-27 09:35:27
【问题描述】:

我的情况:

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

问题:在处理过程中,我还需要创建具有 B 类外键的 C 类(大约 100 万条记录)并保存这个 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);
            }
        }
    }
}

更新:

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

    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);

【问题讨论】:

  • B.getC(): 它返回一个迭代器吗?可以发一下B的代码吗?
  • 返回C项列表
  • 但是每个 B 有 100 万个 C?
  • 不,只是其中几个
  • 如果你可以在内存中拥有的最大对象数是 (commit-intervalB)+(commit-intervalB*C):没什么大不了的,我认为

标签: java spring-batch


【解决方案1】:

如果将commit-interval 减少到一个小值而不是一个选项,因为一个 B 元素最多可以有 10 万个 C 对象,您可以这样做:

将 A 类处理到 B 类,而不在已处理的 B 对象中创建 C 对象;
在您的BWriter 中附加一个ItemWriteListener&lt;B&gt;.afterWrite(),您可以在其中一个接一个地创建/保存C 对象(与在侦听器中收到的List&lt;B&gt; 相关),因此您的内存消耗很低,但您可以保证在事务边界中工作。

如果问题是由于使用 Hibernate 而不是普通 JDBC 造成的,您可以考虑手动使用 Stateless session 或 flush()/clear() session;数据库的 100 万条记录并不是一个大数字
不幸的是,当您拥有大量数据时,ORM 不是最佳选择。

我的 2 美分,我和你一样对 Spring-batch 很陌生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 2018-02-08
    • 2016-11-12
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-04-05
    • 2021-12-28
    相关资源
    最近更新 更多