0

我相信通过明智地使用 Hibernate 的 2 级缓存将在我的应用程序的性能方面做得很好,为此我已经开始从 Internet 和 Hibernate 课程中学习它。尽管对二级缓存及其工作方式有很好的解释,但我的目标是弄清楚事情是如何工作的,从我没有找到的具体问题开始,因此我一般会问一些关于 Hibernate 缓存的问题特别是在二级缓存上。

回答注意事项:

答:即使有些问题看起来很明显或无关紧要,我也很乐意回答。
B. 如果问题取决于缓存提供者,我想听听有关 Ehcache
C 的答案。由于不确定性而回答部分问题将受到欢迎

问题:

  1. 一旦配置了二级缓存,一级缓存会被禁用吗?如果不是,那么在尝试获取实体时如何发生事件过程,首先命中哪个缓存级别?

  2. 查询缓存是将查询文本保存为 HQL 还是原生 SQL?

  3. 二级缓存是否会通过 JPA 和 Hibernate 直接使用 Hibernate 进行相同的工作?

  4. 我了解查询缓存通过使用位于查询缓存中的 ID 访问二级缓存来参与二级缓存。如果某些 ID 由于某种原因不再位于二级缓存中,会再次获取所有实体,还是仅获取不存在的部分?

  5. 关于同步——通过在某个事务中更新存储在二级缓存中的实体——实体何时会在二级缓存中更新?将了解此行为如何影响二级缓存和查询缓存的 更多细节。


    谢谢!

4

2 回答 2

1
  1. 不会。一级缓存继续使用。唯一的区别是实体可能来自二级缓存而不是数据库,并且它们除了数据库之外还保存到二级缓存。

  2. 不像 HQL,因为 Criteria 查询也可以被缓存。我认为使用了 SQL。但这不是必须缓存的唯一内容:查询的参数也被缓存。不过,您不应该关心这一点:缓存会缓存您的查询,只要执行两次相同的查询会命中缓存,而执行非缓存查询则不会。

  3. 是的。

  4. 只有那些不在缓存中的,AFAIK。对其进行测试并查看执行了哪些 SQL 查询。

  5. 这取决于缓存并发策略和缓存的能力。二级缓存主要在实体为只读或几乎只读时有用。

于 2013-08-24T15:48:14.987 回答
0

更多细节:

[4]。查询缓存与更新时间戳缓存结合使用。如果插入/删除/更新了实体类型的任何实例,则对该实体类型的所有查询都将无效。因此,如果任何实体消失了,则该实体类型的所有查询都将失效,因此将重新执行查询。查询缓存以这种方式工作,因为 Hibernate 很难确定某个特定实例是否被任何查询触及,因此它采用了一种安全但不太理想的方法。因此,查询缓存可能只在大多数只读场景中提供性能提升。

[5]。通常,二级缓存在事务的 afterCompletion() 事务同步回调中​​更新。

于 2013-08-27T08:43:53.970 回答