二级缓存如何与 getAll 一起使用并进入 gorm?
Posted
技术标签:
【中文标题】二级缓存如何与 getAll 一起使用并进入 gorm?【英文标题】:How 2nd level cache works with getAll & get in gorm? 【发布时间】:2014-05-14 16:10:57 【问题描述】:您已经为域类设置了“缓存为真”,这意味着缓存已启用
static mapping =
cache true
现在如果我说DomianClass.get(1)
-- 它不会命中数据库,但是当我使用DomianClass.getAll()
时它会命中数据库。
DomianClass.getAll()
不是从缓存中获取的吗?为什么每次都访问数据库?
是否有任何选项可以从二级缓存中获取所有记录?
【问题讨论】:
【参考方案1】:休眠二级缓存无法确定缓存中是否存在“all”。让我们通过一些示例来了解原因。
案例#1
DomainClass.get(1) 询问缓存是否存在 1。如果是,则将其返回,如果未命中数据库,则将其缓存并返回。缓存中对 1 的进一步请求将从缓存中返回。
案例#2
DomainClass.getAll() 询问缓存是否“全部”存在。然后缓存必须思考“这一切意味着什么?”唯一合乎逻辑的反应是“我不知道,但数据库知道。”
现在在#2 的情况下,您/可能/会认为如果您请求“全部”,那么缓存可以缓存该响应。但是,这与休眠的二级缓存不同。
简单地说,二级缓存是针对实例的,按域类和身份进行索引。
【讨论】:
一件事是,如果我说 getAll(1,2,3),也就是说,如果我提供 id,那么它也不会从缓存中获取。这可能是什么原因? 这是一个非常好的问题。我现在无法通过 github 挖掘找出原因,但我确信有技术原因。您可能想在 Grails 邮件列表中提问。以上是关于二级缓存如何与 getAll 一起使用并进入 gorm?的主要内容,如果未能解决你的问题,请参考以下文章
将许多 PropertyList 放入 Google App Engine 数据存储区(在 Go 中)并使用 Query.GetAll 再次加载它们
mybatis缓存,包含一级缓存与二级缓存,包括ehcache二级缓存