Java Hibernate:对不同缓存的访问顺序

Java Hibernate:对不同缓存的访问顺序,java,hibernate,caching,Java,Hibernate,Caching,我对hibernate及其提供的缓存功能相当陌生。经过一些阅读,我发现基本上有四种不同的缓存,其中两种在默认情况下不被激活: 休眠一级缓存 Hibernate查询计划缓存 休眠二级缓存(可选) Hibernate查询缓存(可选) 有人能向我解释一下,当一个客户端软件触发查询时,访问这些缓存的顺序吗?(假设现在我们有四个缓存都处于活动状态并已填充) 我想了解一下:首先Hibernate在这个缓存中查找,然后尝试这个和那个,然后检查这个缓存,然后…,最后仍然执行这个和那个SQL查询。好吧,这取决

我对hibernate及其提供的缓存功能相当陌生。经过一些阅读,我发现基本上有四种不同的缓存,其中两种在默认情况下不被激活:

  • 休眠一级缓存
  • Hibernate查询计划缓存
  • 休眠二级缓存(可选)
  • Hibernate查询缓存(可选)
有人能向我解释一下,当一个客户端软件触发查询时,访问这些缓存的顺序吗?(假设现在我们有四个缓存都处于活动状态并已填充)


我想了解一下:首先Hibernate在这个缓存中查找,然后尝试这个和那个,然后检查这个缓存,然后…,最后仍然执行这个和那个SQL查询。

好吧,这取决于您访问数据的方式

如果您正在访问某个需要延迟加载的实体,Hibernate将按照该顺序检查第一级和第二级缓存,并对缓存未命中发出查询。因此,第一级和第二级缓存也可以命名为实体缓存

另一方面,查询缓存将存储已执行的查询的结果,如果您自己执行查询,将使用这些结果。缓存键将是查询和参数,因此如果两者完全匹配,您将获得缓存命中。即使这样,也可能涉及实体缓存,因为查询缓存只存储实体的ID,Hibernate随后必须在实体缓存中查找或加载这些ID

执行查询时也会使用查询计划缓存,但只缓存已解析的查询(很可能是AST),即查询仍在执行,但缓存命中时不必再次解析

这里有一些更多信息的链接。虽然有点过时,但一般概念仍然有效: