繁体   English   中英

在Hibernate会话批量更新中调用Session.flush

[英]Calling Session.flush in Hibernate session bulk update

我有一个对象列表,对于我正在执行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;
        }
    });
}

通常,您根本不需要调用flush() -Hibernate在执行查询之前和事务提交之前自动刷新会话。 仅当出于某些原因要覆盖默认行为时,才应使用手动flush()

而且,在这种情况下,您甚至不需要调用update() -由于实体是在同一事务中加载的,因此它们状态的更改将自动传播到数据库中。

后者。

还请看看: http : //docs.jboss.org/hibernate/core/3.5/reference/en/html/batch.html

最后调用会话刷新将导致您更有可能仅通过数据库对查询进行软分析。

在批量操作中,将冲洗模式设置为手动可能很有意义。 原因是如果您要进行3万次更新,并且每次更新之前都有选择以验证某些条件,那么休眠将在每次查询(甚至读取)之前刷新会话。 这会使性能降低。 我们已经看到了这种现象,并且通过将“刷新”模式设置为手动,可以看到性能的提高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM