单独调用org.hibernate.Session.flush()
是一种好的做法吗?
正如org.hibernate.Session
文档中所说的,
在提交事务和关闭会话之前,必须在工作单元结束时调用
(根据刷新模式,Transaction.commit()调用此方法)。
如果org.hibernate.Transaction.commit()
已经这么做了,你能解释一下调用flush()
的目的吗?
发布于 2013-01-29 19:38:53
在Hibernate手册中,您可以看到此示例
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
发布于 2014-11-17 23:30:07
flush()
将使您的数据库与内存中保存的对象的当前状态同步,但它不会提交事务。因此,如果在调用flush()
后出现任何异常,则事务将被回滚。您可以使用flush()
将数据库与小块数据同步,而不是使用commit()
一次性提交大量数据,并面临获取OutOfMemoryException
的风险。
commit()
将使存储在数据库中的数据成为永久数据。一旦commit()
成功,您就无法回滚事务。
发布于 2013-01-29 22:37:50
显式刷新的一种常见情况是,您创建了一个新的持久性实体,并希望它生成一个人工主键并将其分配给它,以便以后可以在同一事务中使用它。在这种情况下,调用flush将导致您的实体被赋予一个id。
另一种情况是,如果一级缓存中有很多东西,你想定期清理它(以减少缓存使用的内存量),但你仍然希望将所有东西一起提交。这就是Aleksei's answer所涵盖的情况。
https://stackoverflow.com/questions/14581865
复制相似问题