第1部分:
Hibernate做正确的事。查询缓存不是每个实体的。除非您为查询设置特定的区域,否则所有查询共享一个查询高速缓存区域。每次更新表时,都会在时间戳缓存中更新其时间戳。每次执行查询时,会将查询搜索到的每个表的时间戳与缓存结果的时间戳进行比较。当然,仅当缓存的时间戳比所有表的时间戳都近时才返回缓存的结果。
第2部分:
是的,这很有道理。作者的高速缓存记住ID为456的作者的名称为“
foo”,出生日期为1975/07/19。只记住存储在作者表中的数据。因此,缓存关联也很有用:
author.getBooks()Hibernate不会在调用时进行额外的查询来获取作者的书籍集,而是从其缓存中获取作者的书籍ID,然后从第二个缓存中加载每本书级缓存。不过,请确保缓存书籍。
第3部分:
我可以想象几个原因:
- 实体太多,而且它们变化如此之大,以至于高速缓存命中的数量将非常低,并且与没有高速缓存的解决方案相比,二级高速缓存处理实际上将消耗更多的时间和内存。
- 应用程序是集群的,并且分布式二级缓存的成本和复杂性过高,导致收益较低
- 其他非hibernate应用程序写入同一数据库,因此缓存具有返回陈旧数据的巨大风险,这是不可接受的
- 如果没有二级缓存,一切都会很好地进行,并且没有理由使应用程序比原来的更加复杂。



