JPA saveВсе быстрее и надежнее, чем экономить с большими вставками - PullRequest
0 голосов
/ 14 октября 2018

Недавно я создал приложение, которое брало данные из одной базы данных (устаревшие) и помещало их в другую (новая база данных разработчика).Я обнаружил недоумение, что save не всегда сработало, но saveAndFlush сработало.База данных legacy была в одной транзакции select, а новая база данных была в другой deleteAll и save.

Приложение было очень очень медленным с saveAndFlush и понятно, но save былоне намного лучше.Тогда я решил использовать saveAll, но идея создания огромного списка для каждой таблицы не подходила мне.Поэтому я попытался вызвать гаражную коллекцию следующим образом:

 productRepository.saveAll(productList);

 productList.clear();
 productList = null;
 System.gc();

Затем я добавил jdbc.batch_size к application.properties

logging.level.org.hibernate.SQL=info
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

spring.jpa.generate-ddl = true

spring.jpa.properties.hibernate.jdbc.batch_size = 20
spring.jpa.properties.hibernate.order_inserts = true
spring.jpa.properties.hibernate.order_updates = true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data = true

То, что раньше работало два часа, теперь составляло 5 минут- огромный прирост производительности.

Теперь я запутался в происходящем.Я читаю, что это «обновление и очистка сессии через равные промежутки времени».Но delete и saveAll находятся в одной транзакции - поэтому для меня это не имеет смысла.

Итак, чтобы было понятно, почему два вопроса:

1) Почему не 't save всегда работает, но saveAndFlush будет?

2) Имея 50 таблиц по 20 000 строк в каждой, и каждая таблица создает список, затем saveAll, список очищается и предлагается для сбора мусора.Добавление вышеупомянутого к application.properties привело к невероятно быстрому приложению по сравнению с подходом #1.Зачем?Что делает Hibernate?Обновлять и очищать сеанс через равные промежутки времени?

Я думал, что происходит, когда кэш первого слоя содержит удаление и вставки, а затем зафиксирован и, как мы надеемся, очищен.Видимо, я ошибаюсь или, по крайней мере, не совсем правильно.

Пакетные вставки JPA с данными Hibernate & Spring

...