Поиск по сайту:

Как выполнить пакетную вставку обновления в Hibernate?


В этой статье мы увидим, как можно выполнить пакетную вставку/обновление в спящем режиме.

Всякий раз, когда мы выполняем оператор sql, мы делаем это путем сетевого вызова базы данных. Теперь, если нам нужно вставить 10 записей в нашу таблицу базы данных, нам нужно сделать 10 сетевых вызовов. Вместо этого мы можем оптимизировать наши сетевые вызовы, используя пакетную обработку. Пакетная обработка позволяет нам выполнить группу операторов SQL за один сетевой вызов.

Чтобы понять и реализовать это, давайте определим наши сущности —

@Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; // Getters //Setters }

Чтобы включить пакетную обработку в спящем режиме, нам нужно добавить свойство в наше приложение. файл свойств:

spring.jpa.properties.hibernate.jdbc.batch_size=3

Теперь нам нужно выполнить функцию сохранения EntityManager, чтобы вставить данные в базу данных.

Пример

@Autowired private EntityManager entityManager; @Test Public void InsertInBatch(){ for (int i = 0; i < 6; i++) { Parent parent = Parent[i]; entityManager.persist(parent); } }

Выход

"batch":true, "querySize":1, "batchSize":3, "query":["insert into parent (name, id) values (?, ?)"], "params":[["P1","1"],["P2","2"],["P3","3"]]
"batch":true, "querySize":1, "batchSize":3, "query":["insert into parent (name, id) values (?, ?)"], "params":[["P4","4"],["P5","5"],["P6","6"]]

Из консоли мы видим, что вставка в родительскую таблицу происходит пакетом размером 3.

При сохранении объектов может возникнуть исключение OutOfMemoryException, поскольку Hibernate сохраняет объекты в контексте сохранения. Итак, в целях оптимизации мы можем использоватьlush() иclear() менеджера сущностей после каждого пакета.

Пакетное обновление означает обновление большого объема данных за один сетевой вызов.

Для пакетного обновления процесс тот же. Нам нужно добавить два оператора в файл свойств нашего приложения, а затем выполнить процесс обновления.

spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.batch_versioned_data=true

Пример

Код для обновления данных —

@Autowired private EntityManager entityManager; @Test public void UpdateInBatch() { TypedQuery<Parent> query = entityManager.createQuery("SELECT p from Parent p", Parent.class); List<Parent> Parents = query.getResultList(); int i=1; for (Parent parent : Parents) { String s="Parent"+Integer.toString(i); i++; parent.setName(s); } }

Hibernate теперь свяжет эти инструкции в один пакет и выполнит их.

Выход

"batch":true, "querySize":1, "batchSize":3, "query":["update parent set name=? where id=?"], "params":[["Parent1","1"],[" Parent2","2"],[" Parent3","3"]]
"batch":true, "querySize":1, "batchSize":3, "query":["update parent set name=? where id=?"], "params":[["Parent4","4"],["Parent5","5"],["Parent6","6"]]

Из консоли мы видим, что обновление данных в родительской таблице происходит пакетом размером 3.

Статьи по данной тематике: