hibernate二级缓存VS查询缓存(Second cache VS query cache)
这两个概念,因为对查询缓存重视度不够,容易混。从以下维度比较下:
1.处理时机
2.缓存格式
3.适用范围
4.稍微分析利弊
处理时机
说明:
1.查询缓存在一二级缓存前,使能情况下,先去找查询缓存里面的东西;
2.所有的缓存一定是在调用HQL后发生的,代码一定得走到HQL那块,然后由hibernate暗箱操作。这区别于spring的缓存机制。
缓存格式
一二级缓存 | 查询缓存 |
---|---|
记录的ID:Entity对象 | HQL语句算出的KEY值:记录的ID |
说明:
1.基本可以理解为都是Key-Value的形式,上表说明了基本内容(Key:Value);
2.查询缓存中的KEY值计算,会纳入HQL语句的所有细节,包括查询条件、分页等;
适用范围
一级缓存 | 二级缓存 | 查询缓存 |
---|---|---|
session | sessionFactory | sessionFactory |
说明:
查询缓存的适用范围是否可以跨越sessionFactory?待进一步研究。
稍微分析利弊:
1.查询缓存必须结合一、二级缓存,否则从查询缓存中拿到记录的ID,还得去查数据库;
2. 一、二级缓存只能提高按ID检索的性能,因为存储的KEY值是记录ID;
3.慎用查询缓存,其KEY值中涵盖了HQL语句细节,如果查询条件经常变,缓存命中率低,反而会影响效率;
4.不适合数据常改变的情况,数据如果长改变,但是查询较少,只会增加缓存开销。
综上:一二级缓存,抑或是查询缓存,并不能普适的提高性能,具体问题还得具体分析。
参考:
1.http://blog.csdn.net/mydwr/article/details/8052802
2.http://blog.csdn.net/liu372267001/article/details/6422494
3.http://blog.sina.com.cn/s/blog_614cb62d0100fkp6.html
4.http://blog.163.com/tsing_hua/blog/static/13962222420109222349921
5.http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html
6.《轻量级java EE企业应用实战(第4版)》