Hibernate 二级缓存
Hibernate 二级缓存
类缓存:
类缓存才存Entity的对象内容。
集合缓存:
集合缓存 只存 集合中Entity的id,而不缓存整个Entity对象内容。
如果Entity只开了集合缓存,没开类缓存,则hibernate只能从二级缓存中取到集合中那些Entity的id,具体的内容还是要通过这些id到数据库中去select。
如果Entity开了集合缓存和类缓存,则hibernate可以直接从二级缓存中取到整个 List的内容,不再需要向数据库中进行查询了。
如果我们用 session.createQuery 进行查询,查询的结果会放入一级缓存、二级缓存中,但它本身( session.createQuery)不会主动去使用一级缓存、二级缓存。
即 活雷锋: 我查出的结果会放缓存中,但我自己不用缓存,而是每次到数据库中去做select。
如果希望 session.createQuery 也使用缓存该怎么办呢?开启查询缓存。
查询缓存:
查询缓存中的key是sql语句(这些sql语句会被hibernate解析,保证语义相同的sql,能够命中查询缓存),缓存的value是sql查询出的内容。
查询缓存只对list有用,对iterate方式无用。iterate不会读也不会写查询缓存,list会读也会写查询缓存。【query.list() query.iterate()】
默认hibernate不会开启查询缓存,这是因为查询缓存只有在hql/hql语句语义完全一致的时候,才能命中。
而实际查询场景下,查询条件、分页、排序等构成的复杂查询sql语句很难完全一致。
可能是hibernate觉得命中率低,所以默认关闭了查询缓存。
我们可以根据实际使用情况,决定是否开启查询缓存,唯一的原则就是命中率要尽可能的高。
如果针对A表的查询,查询sql语句基本都是完全一致的情况,就可以针对A使用查询缓存;
如果B表的查询条件经常变化,很难命中,那么就不要对B表使用查询缓存。
开启查询缓存:
<property name="hibernate.cache.use_query_cache">true</property> Query query = hqlSession.createQuery(testHql); query.setCacheable(true);
延伸:
查询缓存会对加了悲观锁的select 查询有效果吗?
应该是没效果的,用了缓存还怎么会向数据库发出select语句了,不发语句,悲观锁又怎么能起到效果呢?
query.list();
浙公网安备 33010602011771号