我遇到了一个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
}
对我有什么建议吗?
答案 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();