Hibernate的缓存策略 二

继上篇博客中hibernate缓存,我们继续说 查询缓存。

三、查询缓存

查询缓存,顾明思议它是查询的时候产生的缓冲,那么就要问了,刚刚在一级缓存,二级缓存中的load,get不一样是查询吗?那是什么样的查询呢?

查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id,这里的ID不是对象的真正ID,它与查询的条件 相关,即where后的条件相关,不同的查询条件,其缓存的id也不一样 。如where age > 10 和 where age >18 就是两个不同的查询缓存ID。

生命周期

当前关联的表发生修改 ,或是 查询条件改变时,那么查询缓存生命周期结束。

查询缓存的条件

有需要重复查询使用的缓冲,如果你两个查询不一样,这个存在的缓冲是不起作用的。

那我们前面讲到了二级缓存,二级缓存和查询缓存是什么关系?

上篇中提到一级,二级缓存是缓存实体对象的,不缓存普通属性结果集,而查询缓存是对一级,二级缓存的一个补充,对非实体的结果集缓存。

使用:

  • 查询缓冲一般设置在list()方法中。
     
  • 查询缓冲必须要告诉hibernate,使用查询缓冲,查询缓冲才会生效。
    第一步:在cfg中设置:
<!-- 启用查询缓存,默认是false是不起用的 -->
<property name="hibernate.cache.use_query_cache">true</property>    

第二步:在程序中起用

 query.setCacheable(true);

这就是查询缓存。

四、总结

缓存要慎用,补充一下使用Hibernate二级缓存的条件:

1) 很少被修改的数据   
2) 不是很重要的数据,允许出现偶尔并发的数据   
3) 不会被并发访问的数据   
4) 常量数据
  
不适合存放到第二级缓存的数据?  
 
1) 经常被修改的数据   
2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   
3) 与其他应用共享的数据。

最后引用网络上前辈的话送给大家:

不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用,可能会有1+N的问题。不当的使用还可能导致读出脏数据。如果受不了hibernate的诸多限制,那么还是自己在应用程序的层面上做缓存吧。
在越高的层面上做缓存,效果就会越好。就好像尽管磁盘有缓存,数据库还是要实现自己的缓存,尽管数据库有缓存,咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么,只能做的比较通用,而高层可以有针对性的实现缓存,所以在更高的级别上做缓存,效果也要好些吧。

你可能感兴趣的:(Hibernate,缓存)