Вызов Session.flush в массовом обновлении сеанса Hibernate - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть список объектов, для каждого объекта, который я выполняю 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 ]

3 голосов
/ 08 апреля 2011

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

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

1 голос
/ 08 апреля 2011

Последний.

Также, пожалуйста, посмотрите на: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/batch.html

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

0 голосов
/ 05 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...