2012-04-11 2 views
0

Я сравниваю производительность базы данных «Обновление» между старым способом и с помощью Hibernate.Hibernate executeUpdate performance

Это моя структура базы данных: Документ -> Код -> Code_Details. Между родительскими таблицами и дочерними таблицами существует соотношение «один ко многим».

Теперь у меня есть около 850 записей Code_Details, которые мне нужно обновить в базе данных.

Ниже старый способ, который выполняет в два раза быстрее:

public void executeDBUpdate(int status1, int status2, int status3){ 
... 
... 
java.sql.Statement statement = connection.createStatement(); 
statement.executeUpdate("update Code_Details set status1="+status1+", status2"+=status2+", status3="+status3"); 

... 
} 

Ниже версия Hibernate:

public void executeDBUpdate(int status1, int status2, int status3){ 
... 
... 
Query query = session.createQuery("update Code_Details set status1=:status1, status2=:status2,status3=:status3);   
query.setParameter("status", status_); 
     query.setParameter("status1",status1); 
     query.setParameter("status2",status2); 
     query.setParameter("status3",status3); 
     query.executeUpdate(); 
     HibernateUtils.commitTransaction("emscribedx"); 

... 
} 

Пожалуйста, обратите внимание, что в обоих вариантах мой «executeDBUpdate (интермедиат, внутр , int) «метод вызывается 850 раз для выполнения каждого обновления базы данных.

Общее время для выполнения этих 850 обновляет старый способ:

954 milliseconds 

Общее время для выполнения тех же 850 обновления с Hibernate является:

1979 milliseconds 

я сломал его и заметил что большую часть времени в версии Hibernate занимает «query.executeUpdate()» -> 954 миллисекунды и «hibernateTransaction.commit()» -> 750 миллисекунд.

Как улучшить производительность Hibernate при выполнении большого количества обновлений?

+0

Итак, большая часть разницы вызвана тем, что ваша версия Hibernate совершает транзакцию после каждого обновления, не так ли? – axtavt

+0

есть. Я заметил, что в версии Hibernate большую часть времени занимает executeUpdate() и commit() для каждого обновления. – Marquinio

ответ

0

Хорошо, теперь я вызываю «query.executeUpdate()» 850 раз в рамках одной транзакции, и это действительно сократило время обработки. Так что в основном «query.executeUpdate()» вызывается 850 раз, но session.commit() вызывается только один раз.

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