【发布时间】:2012-03-09 20:03:54
【问题描述】:
第一部分
在 Grails 应用程序中,我了解到您通过添加启用每个域类的二级缓存
static mapping {
cache true
}
默认情况下,二级缓存仅在调用get() 时使用,但也可以通过在查询中添加cache true 用于条件查询和动态查找器。
但是,我仍然不确定我是否了解查询缓存的工作原理。我的最佳猜测是:
- 每个域类都有单独的查询缓存,例如一个给书,另一个给作者
- 在执行像
Author.findByName('bob', [cache: true])这样的查询之前,会根据域类(作者)、查询(findByName)和查询参数('bob')计算缓存键。如果在作者查询缓存中找到该键,则返回缓存结果而不是执行查询 - 只要作者被保存、删除或更新,作者查询缓存就会被刷新
这似乎是合理的,直到我们考虑到返回 Book 实例的查询可能会连接到 Author 表。在这种情况下,有必要在保存、删除或更新作者时同时刷新 Book 和 Author 查询缓存。这让我怀疑可能只有一个查询缓存,并且在保存任何缓存的域类时都会清除它?
第二部分
在 Grails 文档中提到
除了使用 Hibernate 的二级缓存来缓存实例的能力之外,您还可以缓存对象的集合(关联)。
例如:
class Author {
static hasMany = [books: Book]
static mapping = {
cache true // Author uses the 2nd level cache
books cache: true // associated books use the 2nd level cache
}
}
class Book {
static belongsTo = [author: Author]
static mapping = {
cache true // Book uses the 2nd level cache
}
}
上面的配置是否有意义,即如果作者和书籍本身使用二级缓存,那么让作者-书籍关联也使用二级缓存有什么好处吗?
第三部分
最后,我阅读了this advice 关于使用二级查询缓存的信息,这表明它应该只用于不经常更改的域类。是否存在不应该为get() 操作启用二级缓存的情况,即不将以下内容添加到域类的任何原因
static mapping = {
cache true // Book uses the 2nd level cache
}
【问题讨论】:
标签: hibernate caching grails grails-orm