Утечка памяти в Spring Batch - XML ​​в базу данных с помощью ItemWriter - PullRequest
0 голосов
/ 04 июня 2019

У меня была проблема с заданием 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 голосов
/ 04 июня 2019

Похоже, что OutOfMemoryException вызывается при попытке сохранить слишком много элементов одновременно, попробуйте сохранить элементы в пакетах:

int c = 0;

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

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