【问题标题】:Cached association not get updated upon child item created缓存的关联不会在创建子项时更新
【发布时间】:2013-09-10 18:29:07
【问题描述】:

说,我有域对象

class Parent {
  static hasMany = [children:Child]
  static mapping = {
   cache true
   children cache: true // !!!
  }
}

我有一个管理页面,显示父级和子级列表。 还有一个添加新孩子的能力。 发生在我身上的是当我添加启用行 (!!!) 的新孩子时 - 孩子不会出现在父页面上。虽然它已添加到数据库中,但由于服务器重新启动使其显示。 没有行 (!!!) 它按预期工作。

这是按设计应该如何工作的吗? 我应该手动使关联缓存无效吗? 这个问题cache setting in grails

中也描述了类似的东西

Grails 文档在 http://grails.org/doc/latest/guide/GORM.html#caching 上的信息不是很丰富。

顺便说一句。我正在使用 Grails 2.2.1。

【问题讨论】:

  • 孩子们是不是几乎永远不会更新的东西?
  • 是的。它们由管理员配置,然后主要以只读方式使用,后期更新。
  • 您是否尝试过其他缓存设置? read-write等?

标签: hibernate caching grails ehcache second-level-cache


【解决方案1】:

好的,找到原因了。似乎 Hibernate 是按照这种方式设计的。这里有描述http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache

这部分:

创建新成员并将其与组关联时会发生什么 谁的成员集合被缓存了?如上所述,休眠 不会更新缓存中的集合,它只是将其删除。所以, 我们希望该集合被删除。它应该是,但是有 是应用程序开发人员需要注意的重要细微之处 的:

集合只会在缓存中失效,因为 对代表集合的 Java 对象进行操作! 执行一些导致更改的 Java 操作 数据库,从而重新读取数据库会将成员添加到 收藏不够。

所以解决方法是注入控制器

def sessionFactory

并在 save() 方法中手动使集合缓存无效

sessionFactory.cache.evictCollectionRegions()

【讨论】:

  • 谢谢!这个答案为我节省了很多时间!
【解决方案2】:

read-write 缓存模式默认设置。事实上,您不应该采取任何额外的步骤来使用二级缓存。它应该对用户完全透明。魔法发生在你的代码后面。您是否在 Grails 配置(DataSource.groovy)中开启了 L2 缓存?

【讨论】:

  • 是的,我使用 Ehcache 配置了 Hibernate L2 缓存
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多