我相信,通过明智地使用 Hibernate 的二级缓存,我的应用程序的性能将会得到很好的提高,为此,我已经开始从互联网和 Hibernate 类(class)中学习它。 虽然关于二级缓存及其工作原理有很好的解释,但我的目标是弄清楚事情到底是如何工作的,从我没有找到的具体问题开始,因此我会问一些关于 Hibernate 缓存的一般问题尤其是二级缓存。
回答注意事项:
A.我很乐意回答问题,即使有些问题看起来很明显或无关紧要。
B. 如果问题取决于缓存提供者,我想听听有关 Ehcache 的答案
C. 由于不确定性,欢迎回答部分问题
问题:
配置二级缓存后,一级缓存是否会被禁用?如果不是,那么尝试获取实体时事件的过程如何发生,哪个缓存级别首先被命中?
查询缓存是否将查询文本保存为 HQL 还是 native SQL?
通过 JPA 使用 Hibernate 和直接使用 Hibernate,二级缓存的工作方式是否相同?
我了解查询缓存通过使用位于查询缓存中的 ID 命中二级缓存来参与二级缓存。如果某些 ID 由于某种原因不再位于二级缓存中,是否会再次获取所有实体,或者仅获取不存在的部分?
关于同步 – 通过在某个事务中更新存储在二级缓存中的实体 – 如果有的话,何时会更新二级缓存中的实体?将了解此行为如何影响二级缓存和查询缓存的更多细节。
谢谢!
最佳答案
没有。继续使用一级缓存。唯一的区别是实体可能来自二级缓存而不是数据库,并且除了数据库之外它们还保存到二级缓存。
不像 HQL,因为 Criteria 查询也可以被缓存。我认为使用SQL。但这并不是唯一必须缓存的事情:查询的参数也被缓存。不过,您不应该关心这一点:缓存会缓存您的查询,只要执行相同的查询两次就会命中缓存,它使用的任何内容都无关紧要,而执行非缓存查询则不会。
是的。
仅那些不在缓存中的,据我所知。对其进行测试并查看执行了哪些 SQL 查询。
这取决于 cache concurrency strategy以及缓存的功能。二级缓存主要在实体只读或几乎只读时有用。
关于java - Hibernate二级缓存进阶知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420217/