Grails 在服务中是否需要冲洗?

Grails 在服务中是否需要冲洗?,grails,Grails,我知道如果Grails服务是事务性的,那么可以回滚对save(flush:true)的调用。我的问题是,在服务中是否需要调用flush。这取决于工作场景。理想情况下,不必每次在服务类中保存内容时都刷新,因为一旦从服务类返回,会话就会刷新 但是想象一下这样一个场景:您有两个不同的hibernate会话分别工作,但其中一个会话的数据依赖于另一个会话,然后您需要刷新 例如,会话2需要从数据库中读取数据,该数据经常由会话1在同一时间更新,然后必须将该信息刷新到底层持久性中,以使其可用于会话2 您可以通过

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

这取决于工作场景。理想情况下,不必每次在服务类中保存内容时都刷新,因为一旦从服务类返回,会话就会刷新

但是想象一下这样一个场景:您有两个不同的hibernate会话分别工作,但其中一个会话的数据依赖于另一个会话,然后您需要刷新

例如,会话2需要从数据库中读取数据,该数据经常由会话1在同一时间更新,然后必须将该信息刷新到底层持久性中,以使其可用于会话2


您可以通过在服务类中明确使用
@Transactional
并指定传播/隔离策略(如果需要)来获得事务处理方式的粒度。

这取决于工作场景。理想情况下,不必每次在服务类中保存内容时都刷新,因为一旦从服务类返回,会话就会刷新

但是想象一下这样一个场景:您有两个不同的hibernate会话分别工作,但其中一个会话的数据依赖于另一个会话,然后您需要刷新

例如,会话2需要从数据库中读取数据,该数据经常由会话1在同一时间更新,然后必须将该信息刷新到底层持久性中,以使其可用于会话2


通过在服务类中显式使用
@Transactional
,并指定传播/隔离策略,可以获得事务处理方式的粒度,如果需要。

如果使用Hibernate进行大容量插入,则需要定期刷新会话,以防止出现
OutOfMemoryException
,因为会话将不断增长,直到刷新(并清除)为止。刷新将在Hibernate会话缓存中排队的对象写入数据库(换句话说,执行SQL插入),但是插入在DB事务的范围内,因此可以回滚


将对此主题进行进一步讨论。

如果使用Hibernate进行大容量插入,则需要定期刷新会话,以防止出现
OutOfMemoryException
,因为会话将不断增长,直到刷新(并清除)为止。刷新将在Hibernate会话缓存中排队的对象写入数据库(换句话说,执行SQL插入),但是插入在DB事务的范围内,因此可以回滚


他们将对此主题进行进一步讨论。

如果“会话从服务类返回后会被刷新”,那么,如果会话不是嵌套的,数据怎么可能在第二个会话中不可用?在
一节中,我将所有业务代码都放在服务中,我安全吗?
在本文中有一个示例,其中两个服务在同一个控制器方法中被调用。我希望在第一次服务调用中不需要刷新,但在第二次服务调用中数据始终可用。此外,如果您能提供一个服务中需要刷新的具体示例(在代码中),我将不胜感激。@ubiquibacon为了清楚起见,我特别提到了“同时”。同时进行两次阅读或写作。您指出的文章适用于两个不同服务的连续调用。当我今天有空的时候,我会添加一些代码。同时看看这个。如果“会话从服务类返回后被刷新”,那么除非会话是嵌套的,否则数据怎么可能在第二个会话中不可用?在
一节中,我将所有业务代码都放在服务中,我安全吗?
在本文中有一个示例,其中两个服务在同一个控制器方法中被调用。我希望在第一次服务调用中不需要刷新,但在第二次服务调用中数据始终可用。此外,如果您能提供一个服务中需要刷新的具体示例(在代码中),我将不胜感激。@ubiquibacon为了清楚起见,我特别提到了“同时”。同时进行两次阅读或写作。您指出的文章适用于两个不同服务的连续调用。当我今天有空的时候,我会添加一些代码。同时看看这个。