【问题标题】:Spring Batch memory leak - XML to database using ItemWriterSpring Batch 内存泄漏 - 使用 ItemWriter 到数据库的 XML
【发布时间】:2019-10-20 01:24:23
【问题描述】:

我在使用 Spring Batch 作业读取大型 XML 文件(几百万条记录)并将记录从中保存到数据库时遇到问题。该作业使用 100 个元素的块,MultiResourceItemReader 用于读取 XML,ItemProcessor 用于处理的记录,ItemWriter 用于使用 JPA 和EntityManager 将记录写入数据库。问题是,当调用持久操作时,作业以OutOfMemoryError 结束(我尝试评论 writer 阶段,但问题没有发生)。

public class MyClassWriter implements ItemWriter<MyObject> {

    @Autowired
    private MyDelegate delegate;

    @Override
    public void write(List<? extends MyObject> items) throws Exception {
    ...    
    List<MyObject> foos2 = (List<MyObject>)(List<?>)items; 
    delegate.setInsert(foos2); 
    ...
    }

public void setInsert(List<MyObject> list) {
    for (MyObject el : list) {
        em.persist(el);
    }
    em.flush();
    em.clear(); //I tried to call clear operation too, but not solved problem
}

对我有什么建议吗?

【问题讨论】:

  • 您使用哪个ResourceAwareItemReaderItemStream&lt;T&gt; 作为MultiResourceItemReader 的代表?

标签: spring hibernate jpa out-of-memory spring-batch


【解决方案1】:

好像是一次保存太多项导致OutOfMemoryException,请尝试批量保存:

int c = 0;

for (MyObject mo : list) {
  em.persist(mo);
  if (++c % 1000 == 0) {
    em.flush();
  }
}

// save any remaining items
em.flush();

【讨论】:

  • @Fra83 - 这个解决方案对你有用吗?或者你也可以使用MultiResourceItemReader
  • @artemisian 不幸的是,您的解决方案不能解决我的问题 :(
  • 例如尝试将批量大小从 1000 降低到 10
  • 批量大小是 100 而不是 1000。但是我已经将批量大小从 100 降低到了 10,但是什么都没有..
  • 你能添加 OutOfMemoryError 的完整堆栈跟踪吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多