二级缓存如何与 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二级缓存

Java面试题:Hibernate的二级缓存与Hibernate多表查询

Spring为何需要三级缓存解决循环依赖,而不是二级缓存?

Spring为何需要三级缓存解决循环依赖,而不是二级缓存?

Spring为何需要三级缓存解决循环依赖,而不是二级缓存?