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();  

posted on 2018-03-05 14:01  HB1  阅读(148)  评论(0)    收藏  举报

导航