我相信通过明智地使用Hibernate的二级缓存可以很好地处理我的应用程序的性能,并且为此我已经开始从互联网和Hibernate课程中学习它。 虽然对二级缓存有很好的解释,基本上它的工作方式,我的目标是弄清楚事情是如何工作的,从我没有找到的具体问题开始,因此我会问一些关于Hibernate缓存的问题。特别是二级缓存。
一个。即使有些问题显而易见或无关紧要,我也很乐意回答问题 B.如果问题取决于缓存提供者,我想听听关于Ehcache的答案 C.欢迎因不确定性回答部分问题
配置第二级缓存后,第一级缓存是否会被禁用?如果不是,那么在尝试获取实体时,事件的过程如何发生,首先会遇到哪个缓存级别?
查询缓存是否将查询文本保存为HQL或本机SQL?
第二级缓存是否会通过JPA和Hibernate直接使用Hibernate工作?
我理解查询缓存通过点击位于查询缓存中的ID的二级缓存来参与二级缓存。如果某些ID由于某种原因不再位于二级缓存中,将再次获取所有实体,或者只是不存在的部分,该怎么办?
关于同步 - 通过在某个事务中更新存储在二级缓存中的实体 - 如果要在二级缓存中更新实体,该实体何时会更新?将非常感谢进一步详细信息此行为如何影响二级缓存和查询缓存。
谢谢!
答案 0 :(得分:1)
没有。继续使用第一级缓存。唯一的区别是实体可能来自二级缓存而不是数据库,除了数据库外,它们还保存到二级缓存。
不是HQL,因为Criteria查询也可以缓存。我认为使用SQL。但这不是必须缓存的唯一内容:查询的参数也被缓存。您不应该关心这一点:缓存缓存您的查询,无论它使用什么都无关紧要,只要执行两次相同的查询将达到缓存,并且执行非缓存查询将不会。
是。
只有那些不在缓存中的人,AFAIK。测试它并查看执行的SQL查询。
这取决于cache concurrency strategy和缓存的功能。当实体是只读或几乎只读时,二级缓存主要有用。
答案 1 :(得分:0)
更多细节:
[4]。查询缓存与更新时间戳缓存一起使用。如果插入/删除/更新了实体类型的任何实例,则该实体类型的所有查询都将失效。因此,如果任何实体消失,则该实体类型的所有查询都将失效,因此将重新执行查询。查询缓存以这种方式工作,因为它对于Hibernate来说太贵了,无法确定任何查询是否触及了特定实例,因此它需要一种安全但不太理想的方法。因此,查询缓存可能仅在大多数只读方案中提供性能提升。
[5]。通常,在事务的afterCompletion()事务同步回调中更新第二级缓存。