У меня есть список объектов, для каждого объекта, который я выполняю Session.update (), когда мне следует вызывать Session.flush ()? После завершения итерации списка или после каждого обновления? Сегмент кода:
public void updateUserAssignmentInfo(final long itemId) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
session.flush();
session.setCacheMode(CacheMode.IGNORE);
List<UserAssignmentInfo> userAssignmentInfos = session.createQuery("from UserAssignmentInfo as userAssignmentInfo where userAssignmentInfo.itemId = " + itemId).list();
if (userAssignmentInfos.size() == 0) {
return null;
}
for (UserAssignmentInfo userAssignmentInfo : userAssignmentInfos) {
userAssignmentInfo.setIsCurrentlyAssigned(false);
session.update(userAssignmentInfo);
// should I call flush here?
}
session.flush(); // or here?
return null;
}
});
}
3 ответа
Последний.
Также обратите внимание на: http://docs.jboss.org/hibernate/core /3.5/reference/en/html/batch.html
Вызов сброса сеанса в конце приведет к тому, что у вас будет более высокая вероятность того, что запрос будет только мягко проанализирован базой данных.
Обычно вам вообще не нужно вызывать flush()
- Hibernate автоматически очищает сессию перед выполнением запросов и перед фиксацией транзакции. Ручной flush()
следует использовать только в том случае, если у вас есть причины изменить поведение по умолчанию.
Более того, в этом сценарии вам даже не нужно вызывать update()
- поскольку сущности были загружены внутри одной транзакции, изменения их состояния будут автоматически распространяться в базу данных.
При массовых операциях может иметь смысл установить ручной режим промывки. Причина в том, что если вы выполняете, скажем, 30 тыс. обновлений и перед каждым обновлением есть выбор для проверки некоторых условий, спящий режим будет сбрасывать сеанс перед каждым запросом, даже при чтении. Это приведет к снижению производительности. Мы наблюдали такое поведение, и переключив режим промывки на ручной, было замечено улучшение производительности.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.