2012-01-01 3 views
0

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

<property name="hibernateProperties"> 
      <value> 
       hibernate.dialect=org.hibernate.dialect.MySQLDialect 
       hibernate.hbm2ddl.auto=update 
       hibernate.show_sql=false 
       hibernate.jdbc.fetch_size=100 
       hibernate.jdbc.batch_size=100 
       hibernate.jdbc.batch_versioned_data=true 
       hibernate.order_inserts=true 
       hibernate.order_updates=true 
       hibernate.cache.use_query_cache=false 
       hibernate.cache.use_second_level_cache=false 

      </value> 
     </property> 

и вот DAO код:

public void updateBulkEmployees(List<Employee> employees) throws Exception { 

     for (int i = 0; i < employees.size(); i++) { 
      sessionFactory.getCurrentSession().update(employees.get(i)); 
      if (i % 100 == 0) { 
       sessionFactory.getCurrentSession().flush(); 
       sessionFactory.getCurrentSession().clear(); 
       log.debug("Flushing batch:" + (int) (i/100)); 
      }    

     } 

      sessionFactory.getCurrentSession().flush(); 
      sessionFactory.getCurrentSession().clear(); 

    } 

ВЫПУСКА: я могу заметить, что выполнение метода занимает столько времени (в то же время, что и без использования пакетной обработки), поэтому пакетное обновление не работает, мне что-то не хватает в конфигурации или что-то не так? сообщите пожалуйста, спасибо.

+0

Просто потому, что он принимает то же самое время, это не означает, что обновления не загружаются. Это также может означать, что дозирование используется, но просто не ускоряет работу. –

+0

, значит, вы имеете в виду, что у конфигурации выше ничего плохого или не может не улучшиться или настроиться больше? –

+0

@JB Nizet, и как сделать вещи быстрее в таком случае, что вы предлагаете? –

ответ

0

Не должно быть второго «sessionFactory.getCurrentSession(). Flush();» быть вне цикла?

+0

попробовал ее за пределами цикла for, и я получаю такую ​​же производительность. –

1

Откуда вы знаете, что пакетная вставка работает? Смотреть mysql.log - единственный способ узнать, работает ли пакетная вставка/обновление (Hibernate всегда регистрирует один запрос, даже если пакет используется).

Чтобы использовать пакет с MySQL, вы должны установить в своем URL определенном параметре JDBC (пакет Hibernate использует пакетную функцию JDBC). Попробуйте с:

http://your_host:your_port/database?rewriteBatchedStatements=true

И не используйте GenerationType.AUTO или GenerationType.IDENTITY в качестве генератора Id. В этом случае спящий режим отключает бесшумную пакетную функцию.

Советы: Промежуточный флеш необходим только для исключения OutOfMemory. Hibernate попытается запросить базу данных как можно более последней, поэтому, если вы попытаетесь обновить 1000000 сущностей, она сохранит все сущности в памяти до фиксации.

Смежные вопросы