Пакетная вставка JPA не освобождает память - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь использовать SpringBoot JPA для вставки около 100 тыс. Элементов (сущностей) в базу данных. Но JVM не хватает памяти.

try (Stream<Path> paths = Files.walk(Paths.get(this.folderPath))) {
            paths.filter(Files::isRegularFile).map(Parser::parse).forEach(item -> {
                log.debug("Load trade : " + item.getId());
                itemService.save(item);
            });
        }

, где itemService - это сервис, который использует ItemRepository, а ItemRepository - репозиторий JPA:

ItemRepository extends JpaRepository<Item, String> {}

В Applicateion.yml я поместил следующеенастройки и надеюсь, что это поможет избежать утечки памяти:

jpa:
    properties:
      hibernate:
        generate_statistics: true
        jdbc.batch_size: 2000

Насколько я понимаю, это будет выполнять пакетную вставку для каждых 2000 экземпляров и освобождать память после каждой пакетной вставки. Тем не менее, я все еще исчерпал исключение памяти. Мне кажется, что itemService задерживает все сделки, поэтому GC не выполняется.

Я новичок в JPA, и может кто-нибудь подсказать мне, что я могу сделать, чтобы избежать утечки памяти?

Оцените.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вы должны использовать метод saveAll, чтобы пакетное обновление работало.

Например

try (Stream<Path> paths = Files.walk(Paths.get(this.folderPath))) {
    List<Path> files = paths
            .filter(Files::isRegularFile)
            .collect(Collectors.toList());

    for (List<Path> batch : Lists.partition(files, 2000)) { // Lists from Guava, batch will be 2000 elements or less.
        List<Item> parsed = batch.stream().map(Parser::parse).collect(Collectors.toList());
        itemService.saveAll(parsed);
    }
}
0 голосов
/ 11 октября 2019

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

 jdbc:postgresql://localhost:5432/yourDB?reWriteBatchedInserts=true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...