Java 关于Hibernate二级缓存的高级知识

Java 关于Hibernate二级缓存的高级知识,java,hibernate,ehcache,second-level-cache,query-cache,Java,Hibernate,Ehcache,Second Level Cache,Query Cache,我相信,明智地使用Hibernate的二级缓存将使我的应用程序的性能得到很好的提高,为此,我已经开始从internet和Hibernate课程学习它。 虽然关于二级缓存及其工作方式有很多很好的解释,但我的目标是从我没有发现的具体问题开始,准确地了解事情是如何工作的,因此我会问一些关于Hibernate缓存的问题,特别是关于二级缓存的问题 关于回答的注意事项: 答:我很乐意回答问题,即使有些问题看起来很明显或不相关。 B.如果问题取决于缓存提供程序,我想听听关于Ehcache的答案 C.由于不确定

我相信,明智地使用Hibernate的二级缓存将使我的应用程序的性能得到很好的提高,为此,我已经开始从internet和Hibernate课程学习它。 虽然关于二级缓存及其工作方式有很多很好的解释,但我的目标是从我没有发现的具体问题开始,准确地了解事情是如何工作的,因此我会问一些关于Hibernate缓存的问题,特别是关于二级缓存的问题

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

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

  • 查询缓存是否将查询文本保存为HQL或本机SQL

  • 通过JPA使用Hibernate和直接使用Hibernate,二级缓存的工作方式是否相同

  • 我知道查询缓存通过命中位于查询缓存中的ID为的二级缓存参与二级缓存。如果由于某种原因,某些ID不再位于二级缓存中,那么将再次获取所有实体,还是仅获取不存在的部分

  • 关于同步,通过在某个事务中更新存储在二级缓存中的实体,该实体何时会在二级缓存中更新?希望进一步了解此操作对二级缓存和查询缓存的影响。


    谢谢大家!

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

  • 与HQL不同,因为还可以缓存条件查询。我认为使用了SQL。但这不是必须缓存的唯一内容:查询的参数也会被缓存。不过,您不应该在意这一点:缓存会缓存您的查询,不管它使用什么,只要执行两次相同的查询就会命中缓存,而执行未缓存的查询则不会

  • 只有那些不在缓存中的,好的。测试它并查看执行了哪些SQL查询

  • 这取决于和缓存的功能。当实体为只读或几乎只读时,二级缓存主要有用

  • 还有一些细节:

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


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

    与答案1相关-如果i尝试获取一个在一级和二级缓存中使用的实体,过程将是:在一级缓存中搜索实体,然后在二级缓存中搜索实体,因为没有实体,所以将实体同时添加到一级和二级缓存中。我的话是真的吗?