在 Grails 中缓存域对象

Posted

技术标签:

【中文标题】在 Grails 中缓存域对象【英文标题】:Caching domain objects in Grails 【发布时间】:2011-09-18 19:56:22 【问题描述】:

我一直在考虑在我的 Grails 域对象中实现 EhCache,如下所示:

static mapping = 
   cache true

我不太熟悉这种缓存机制的具体工作原理,并且想知道在确定哪些域对象将从缓存中受益时,有什么好的经验法则。例如,很少访问的对象......经常......?

谢谢!

【问题讨论】:

【参考方案1】:

默认情况下,缓存仅适用于 get() 调用,但如果您使用 cache: true(标准和 HQL)更新查询,则查询会使用查询缓存。

cache true 创建一个读写缓存,但你可以配置一个只读缓存

static mapping = 
   cache usage:'read-only'

只读缓存适用于查找永远不会改变的数据,例如州、国家、角色等。

如果您有频繁更新、创建或删除的域类,查询缓存通常会比不缓存慢。这是因为这样的更改会导致所有缓存的查询都被清除,因此您通常还是直接访问数据库。请参阅http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ 以获得更详细的描述。出于这个原因,我很少使用查询缓存并且经常完全禁用它

hibernate 
    cache.use_second_level_cache=true
    cache.use_query_cache=false
    cache.provider_class='org.hibernate.cache.EhCacheProvider'

“主要读取”的域类是读写缓存的最佳候选者。每次更新、创建和删除缓存都会被清除,但如果这些缓存很少见,您会看到整体性能提升。

Hibernate 有一个 API 来监控缓存使用情况。 http://grails.org/plugin/app-info 和 http://grails.org/plugin/hibernate-stats 插件使信息可用,您可以在自己的代码中使用该方法。

【讨论】:

有没有办法让缓存超时并重新读取? IE。指定最大年龄? Grails 缓存似乎非常非常基础。我看到有许多 ehcache 插件,包括“Pivotal 支持的 Ehcache 缓存插件”,但目前尚不清楚这将如何通过休眠通过其缓存(似乎也是 ehcache)与域缓存中内置的 grails 交互或干扰。 嘿Burt,是否可以通过休眠区域隔离域明智的缓存?这意味着一个域中的更新不会导致清除所有其他域的查询缓存。

以上是关于在 Grails 中缓存域对象的主要内容,如果未能解决你的问题,请参考以下文章

Grails 3 @Delegate 表示法,使用域对象

从域对象调用 Grails 服务是否很糟糕? [关闭]

如何在 Grails 中复制域对象?

Grails 2 - 无法创建弹簧安全域对象

为啥 Grails 在域对象保存时不通知我错误?

Grails - 向所有域对象添加 where 子句