繁体   English   中英

有关Hibernate二级缓存的高级知识

[英]Advanced knowledge on Hibernate second-level cache

我相信,明智地使用Hibernate的二级缓存将在我的应用程序性能方面做得很好,为此,我已经从Internet和Hibernate课程开始对其进行研究。 尽管对二级缓存及其工作方式有很好的解释,但我的目标是从我没有找到的特定问题开始,确切地了解事情的工作方式,因此我将总体上对Hibernate的缓存提出一些问题。尤其是二级缓存。

有关回答的注意事项:

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

问题:

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

  2. 查询缓存是否将查询文本另存为HQL或本机SQL?

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

  4. 我了解到查询缓存会通过与位于查询缓存中的ID命中二级缓存来参与二级缓存。 如果由于某种原因某些ID不再位于第二级缓存中,又将再次获取所有实体,或者只是获取不存在的那一部分怎么办?

  5. 关于同步–在某个事务中通过更新存储在第二级高速缓存中的实体–完全什么时候在第二级高速缓存中更新实体? 进一步了解此行为可能如何影响二级缓存和查询缓存的更多详细信息


    谢谢!

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

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

  3. 是。

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

  5. 这取决于高速缓存并发策略高速缓存的功能。 当实体为只读或几乎只读时,二级缓存主要有用。

更多细节:

[4]。 查询缓存与更新时间戳缓存结合使用。 如果插入/删除/更新了实体类型的任何实例,则对该实体类型的所有查询都将无效。 因此,如果任何实体消失了,则对该实体类型的所有查询都将无效,因此将重新执行该查询。 查询缓存以这种方式工作,因为对于Hibernate而言,要确定某个实例是否被任何查询所触及,将是太昂贵了,因此它采用了一种安全但并非最佳的方法。 因此,查询缓存可能仅在大多数只读情况下提供性能提升。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM