首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate: flush()和commit()

Hibernate: flush()和commit()
EN

Stack Overflow用户
提问于 2013-01-29 19:29:05
回答 7查看 173.4K关注 0票数 87

单独调用org.hibernate.Session.flush()是一种好的做法吗?

正如org.hibernate.Session文档中所说的,

在提交事务和关闭会话之前,必须在工作单元结束时调用

(根据刷新模式,Transaction.commit()调用此方法)。

如果org.hibernate.Transaction.commit()已经这么做了,你能解释一下调用flush()的目的吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-01-29 19:38:53

在Hibernate手册中,您可以看到此示例

代码语言:javascript
运行
复制
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for (int i = 0; i < 100000; i++) {
    Customer customer = new Customer(...);
    session.save(customer);
    if (i % 20 == 0) { // 20, same as the JDBC batch size
        // flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

如果不调用flush方法,一级缓存将抛出OutOfMemoryException

Also you can look at this post about flushing

票数 104
EN

Stack Overflow用户

发布于 2014-11-17 23:30:07

flush()将使您的数据库与内存中保存的对象的当前状态同步,但它不会提交事务。因此,如果在调用flush()后出现任何异常,则事务将被回滚。您可以使用flush()将数据库与小块数据同步,而不是使用commit()一次性提交大量数据,并面临获取OutOfMemoryException的风险。

commit()将使存储在数据库中的数据成为永久数据。一旦commit()成功,您就无法回滚事务。

票数 87
EN

Stack Overflow用户

发布于 2013-01-29 22:37:50

显式刷新的一种常见情况是,您创建了一个新的持久性实体,并希望它生成一个人工主键并将其分配给它,以便以后可以在同一事务中使用它。在这种情况下,调用flush将导致您的实体被赋予一个id。

另一种情况是,如果一级缓存中有很多东西,你想定期清理它(以减少缓存使用的内存量),但你仍然希望将所有东西一起提交。这就是Aleksei's answer所涵盖的情况。

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14581865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档