【问题标题】:Calling Session.flush in Hibernate session bulk update在 Hibernate 会话批量更新中调用 Session.flush
【发布时间】:2012-03-06 00:40:07
【问题描述】:

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

【问题讨论】:

    标签: java hibernate session


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      后一种。

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

      最后调用 session flush 会导致你有更高的概率查询只会被数据库软解析。

      【讨论】:

        【解决方案3】:

        在批量操作中,将刷新模式设置为手动可能是有意义的。原因是如果你正在做让我们说 30k 更新并且在每次更新之前都有选择来验证某些条件,休眠将在每次查询之前刷新会话,甚至读取。这会使性能下降。 我们已经看到了这种行为,通过将 Flush 模式转换为手动,可以看到性能的改进

        【讨论】:

          猜你喜欢
          • 2012-02-16
          • 1970-01-01
          • 2013-07-11
          • 2017-10-06
          • 2011-09-16
          • 2011-03-14
          • 2022-12-09
          • 2011-11-13
          • 1970-01-01
          相关资源
          最近更新 更多