是否有必要刷新服务?

时间:2013-08-12 14:38:58

标签: grails

我知道如果Grails服务是事务性的,则可以回滚对save(flush: true)的调用。我的问题是,是否需要在服务中调用flush。

2 个答案:

答案 0 :(得分:3)

这取决于工作方案。理想情况下,每次在服务类中保存某些内容时都不需要刷新,因为会话从服务类返回后会刷新。

但是想想你有两个不同的hibernate会话分开工作的情况,但是一个的数据依赖于另一个,那么你需要刷新。

例如,会话2需要从db读取的数据,这些数据经常由会话1同时更新,然后必须将该信息刷新到基础持久性以使其可用于会话2。

如果需要,您可以明确地使用服务类中的@Transactional并指定传播/隔离策略来获取有关如何处理事务的粒度。

答案 1 :(得分:2)

如果您正在使用Hibernate进行批量插入,那么您将需要定期刷新会话以防止OutOfMemoryException,因为会话将一直保持增长直到刷新(并清除)。 Flushing将在Hibernate Session缓存中排队的对象写入数据库(换句话说,执行SQL插入),但插入在DB事务的范围内,因此可以回滚它们。

Hibernate docs进一步讨论了这一主题。