在 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 中缓存域对象的主要内容,如果未能解决你的问题,请参考以下文章