在Grails中缓存域对象

时间:2011-06-20 15:53:00

标签: caching grails

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

static mapping = {
   cache true
}

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

谢谢!

1 个答案:

答案 0 :(得分:29)

默认情况下,缓存仅适用于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-infohttp://grails.org/plugin/hibernate-stats插件可以提供相关信息,您可以在自己的代码中使用该方法。