Spring Batch内存泄漏-使用ItemWriter的XML到数据库

时间:2019-06-04 13:40:36

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

我遇到了一个Spring Batch作业的问题,即读取一个大型XML文件(几百万条记录)并将这些记录保存到数据库中。作业使用100个元素组成的块,而MultiResourceItemReader用于读取XML,ItemProcessor用于处理的记录,ItemWriter用于使用JPA和EntityManager将记录写入数据库。问题在于,当调用持久化操作时,作业以OutOfMemoryError结尾(我尝试在注释编写器阶段进行注释,并且不会发生此问题)。

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
}

对我有什么建议吗?

1 个答案:

答案 0 :(得分:0)

似乎是试图一次保存太多项目,并尝试批量保存项目时导致的OutOfMemoryException:

int c = 0;

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

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