Недавно я создал приложение, которое брало данные из одной базы данных (устаревшие) и помещало их в другую (новая база данных разработчика).Я обнаружил недоумение, что 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