Пакетное обновление с весны данных jpa - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь обновить таблицу в пакетном режиме.Ниже моя конфигурация:

spring.jpa.properties.org.hibernate.flushMode=COMMIT
spring.jpa.properties.hibernate.jdbc.batch_size=10
spring.jpa.properties.hibernate.order_inserts=true 
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.org.hibernate.SQL=DEBUG
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.generate_statistics=true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true

Ниже приведены методы, где на самом деле:

    @Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateEmployeeDetails(Map<String, List<String>> orgEAMap) {
    ....
    updateEmployee(employeeMap);
}


public void updateEmployee(Map<String, String> employeeMap) {
    //int i =0;
    for (Entry<String, String> mapEntry : employeeMap.entrySet()) {
        Query query = em.createNativeQuery("UPDATE employee emp SET emp.name = :name WHERE emp.id = :id");
        query.setParameter("id", mapEntry.getValue());
        query.setParameter("name", mapEntry.getKey());
        query.executeUpdate();
        //if(i==10){
            //LOG.info("Flushmode"+em.getFlushMode());
            //em.flush();
        //}
        //i++;
    }
}

Я попытался сбросить после определенного подсчета вручную, но сброс (частичное сбрасывание) уже происходитпосле выполнения каждого запроса.Из журналов статистики видно, что создается 10 операторов, и происходит 0 пакетных операций и сбросов.

1 Ответ

0 голосов
/ 30 ноября 2018

Пакетная конфигурация Hibernate влияет только на то, как обрабатываются объекты и их изменения.Явные запросы выполняются немедленно.

Если вы хотите использовать пакетную обработку, я вижу две опции:

  1. фактически загружает сущности, изменяет атрибут, который вы хотите обновить, и позволяет Hibernate делать этовещь.Конечно, это создает дополнительные накладные расходы на загрузку объектов, что, вероятно, нежелательно.
  2. Используйте SQL напрямую, используя источник данных, шагая в сторону EntityManager.Для этого я бы рекомендовал использовать шаблон Spring.

Примечание. Возможно, вы также захотите обновить атрибут версии, чтобы избежать потерянных обновлений.

...