【问题标题】:Is it ever necessary to flush in a service?是否有必要在服务中刷新?
【发布时间】:2013-08-12 14:38:57
【问题描述】:

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

【问题讨论】:

    标签: grails


    【解决方案1】:

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

    但是考虑一个场景,您有两个不同的休眠会话单独工作,但来自一个的数据依赖于另一个,那么您需要刷新。

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

    您可以通过在服务类中显式使用@Transactional 并指定传播/隔离策略(如果需要)来详细了解如何处理事务。

    【讨论】:

    • 如果“会话在从服务类返回后被刷新”,那么除非会话是嵌套的,否则第二个会话中的数据怎么可能不可用?在文章hereI am putting all my business code in services, am I safe? 部分中,有一个示例在同一个控制器方法中调用了两个服务。我希望第一次服务调用不需要刷新,但数据在第二次调用时仍然可用。
    • 另外,如果您可以在服务中需要刷新时提供一个具体示例(在代码中),我将不胜感激。
    • @ubiquibacon 我特别提到了“同时”以明确表示。两个会话同时阅读或写作。您指出的文章适用于对两个不同服务的两次连续调用。今天有空的时候我会添加一些代码。同时看看这个question
    【解决方案2】:

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

    Hibernate docs对此话题有进一步的讨论。

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 1970-01-01
      • 2013-03-23
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多