【发布时间】:2011-09-18 19:56:22
【问题描述】:
我一直在考虑在我的 Grails 域对象中实现 EhCache,如下所示:
static mapping = {
cache true
}
我不太熟悉这种缓存机制的具体工作原理,并且想知道在确定哪些域对象将从缓存中受益时,有什么好的经验法则。例如,很少访问的对象......经常......?
谢谢!
【问题讨论】:
我一直在考虑在我的 Grails 域对象中实现 EhCache,如下所示:
static mapping = {
cache true
}
我不太熟悉这种缓存机制的具体工作原理,并且想知道在确定哪些域对象将从缓存中受益时,有什么好的经验法则。例如,很少访问的对象......经常......?
谢谢!
【问题讨论】:
默认情况下,缓存仅适用于 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 插件使信息可用,您可以在自己的代码中使用该方法。
【讨论】: