2015-10-05 2 views
2

У меня есть около 5000 записей для обновления. Я пытаюсь измерить эффективность операции. Он начинается примерно с 100 мс, но после каждых тысяч обновлений время работы увеличивается примерно на 80 мс. Почему он замедляется? JVM?Hibernate Batch Operation performance

StatelessSession session = dao.getStatelessSession(); 
Transaction transaction = session.beginTransaction(); 
try { 
    List<Entity> list = dao.findAll(); 
    int counter = 0; 
    for (Entity each : list) { 
     final Date startTime = Clock.getTime(); 
     webService.execute(each); 
     session.update(each); 
     counter += 1; 
     final Date endTime = Clock.getTime(); 
     LOGGER.info("***** " + getMilliSecondsDifference(startTime, endTime) + " for count: " + counter + "*****"); 
    } 
} catch (Exception e) { 
    LOGGER.info("***** Exception occured : ", e); 
} finally { 
    transaction.commit(); 
    session.close(); 
} 
+3

Был бы также вызов webService. Что заставляет вас думать, что спящий режим становится медленнее? Я предлагаю вам закрыть часть выполнения werbservice и снова измерить ее. –

+0

После закрытия вызова webservice я попробовал с 15000 объектами, и все они составляют около 4 мс. Это похоже на ответ, но я не могу принять комментарий в качестве ответа. Можете ли вы опубликовать это как ответ? –

ответ

1

Hüseyin,

Это не обязательно проблема спящего режима, если мы посмотрим на ваш код. Я предлагаю вам прокомментировать вашу линию, связанную с вызовом webservice.

Затем, пожалуйста, повторите попытку запуска hql.

Возможно, создание сети может замедляться.

0

У вас есть одна транзакция и дело с большим количеством объектов. здесь вы, вероятно, столкнетесь с проблемой утечки памяти и производительности. Ссылки на объекты останутся в памяти до тех пор, пока не будет выполнен сеансовый флеш (фиксация). поэтому у вас будет большое количество объектов в памяти в дополнение к большому количеству информации об изменениях объекта, которые также будут храниться в сеансе спящего режима и которые могут также изменить производительность (я не специалист по спячке, но вы должны рассмотреть этот пункт) Я думаю, что вы можете думать об использовании большого количества сделок

См тезисы интересные ссылки:

Transaction Management for bulk operations

Hibernate session and Transaction Management Guidelines

удачи

+0

Я использую StatelessSession, который не хранит каждый грязный объект. Даже для обычного сеанса несколько транзакций не нужны. Вам просто нужно очистить и очистить. Как вы сказали, я измерил несколько транзакций, и это одно и то же. –

+0

Понимаю, это усложняет ситуацию, вы можете попытаться выяснить, вызвано ли это вызовом webservice или базой данных. попробуйте проигнорировать один из них и увидеть результаты (например, игнорировать обновление и поддерживать вызов webservice) – jMounir