Caching domain objects in Grails

2019-03-12 14:28发布

I have been considering implementing EhCache in my Grails domain objects like this :

static mapping = {
   cache true
}

I am not too familiar with exactly how this caching mechanism works and was wondering what a good rule of thumb is in determining which domain objects would benefit from being cached. eg, objects that are accessed rarely.. often... ?

Thanks!

1条回答
姐就是有狂的资本
2楼-- · 2019-03-12 15:19

Caching only works for get() calls by default, but queries use the query cache if you update them with cache: true (criteria and HQL).

cache true creates a read-write cache but you can configure a read-only cache with

static mapping = {
   cache usage:'read-only'
}

The read-only cache is good for lookup data that never changes, for example states, countries, roles, etc.

If you have domain classes that update, create, or delete frequently, query caching will often be slower than not caching. This is because changes like these cause all cached queries to be cleared, so you're often going directly to the database anyway. See http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ for a more detailed description of this. For this reason I rarely use query caching and often disable it completely with

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

Domain classes that are "read-mostly" are the best candidates for read-write caching. The caches get cleared for each update, create, and delete, but if these are somewhat rare you'll see an overall performance boost.

Hibernate has an API to monitor cache usage. The http://grails.org/plugin/app-info and http://grails.org/plugin/hibernate-stats plugins make the information available and you can use the approach there in your own code.

查看更多
登录 后发表回答