查询缓存和二级缓存是有关联关系的,他们不是完全独立的两套东西。假如一个查询条件hql_1,第一次被执行的时候,它会从数据库取得数据,然后把查询条件作为key,把返回数据的所有id列表作为value(请注意仅仅是id)放到查询缓存中,同时整个结果集放到class缓存(也就是二级缓存), key是id,value是pojo对象。当你再次执行hql_1,它会从缓存中得到id列表,然后根据这些列表一个一个的到class缓存里面去找 pojo对象,如果找不到就向数据库发起查询。也就是说,如果二级缓存配置了超时时间(或者发呆时间),就有可能出现查询缓存命中了,获得了id列表,但是class里面相应的pojo已经因为超时(或发呆)被失效,hibernate就会根据id清单,一个一个的去向数据库查询,有多少个id,就执行多少个sql。该情况将导致性能下降严重。
查询缓存和二级缓存(摘录)
最新推荐文章于 2025-08-25 10:36:15 发布
本文解析了查询缓存与二级缓存之间的关联性及其工作原理。当首次执行查询时,查询结果的ID列表会被存储在查询缓存中,而完整的POJO对象则存放在二级缓存。若二级缓存中的对象因超时而失效,即使查询缓存仍有效,系统也将针对每个ID向数据库发起单独查询,这可能导致性能显著下降。
2万+

被折叠的 条评论
为什么被折叠?



