У меня есть список объектов, для каждого объекта, который я выполняю 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;
        }
    });
}
0
Tapas Bose 8 Апр 2011 в 16:13

3 ответа

Лучший ответ

Последний.

Также обратите внимание на: http://docs.jboss.org/hibernate/core /3.5/reference/en/html/batch.html

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

1
Marcin 8 Апр 2011 в 16:19

Обычно вам вообще не нужно вызывать flush() - Hibernate автоматически очищает сессию перед выполнением запросов и перед фиксацией транзакции. Ручной flush() следует использовать только в том случае, если у вас есть причины изменить поведение по умолчанию.

Более того, в этом сценарии вам даже не нужно вызывать update() - поскольку сущности были загружены внутри одной транзакции, изменения их состояния будут автоматически распространяться в базу данных.

3
axtavt 8 Апр 2011 в 16:19

При массовых операциях может иметь смысл установить ручной режим промывки. Причина в том, что если вы выполняете, скажем, 30 тыс. обновлений и перед каждым обновлением есть выбор для проверки некоторых условий, спящий режим будет сбрасывать сеанс перед каждым запросом, даже при чтении. Это приведет к снижению производительности. Мы наблюдали такое поведение, и переключив режим промывки на ручной, было замечено улучшение производительности.

0
vsingh 5 Мар 2012 в 20:40