您的位置:首页 > 其它

浅析 hibernate二级缓存与查询缓存之间的关系

2017-01-22 17:55 211 查看
我们先看一下什么样的hibernate操作会将数据存入到一级缓存中去,当调用下边这些方法的时候会将数据存入到一级缓存中


一级缓存

save、update、saveOrupdate、load、list、iterate、lock,例如:

[java] view
plain copy

User userOne=new User();    

user.setName("名字");   

//放入一级缓存    

s.save(user);    

//查询  

User userTwo=(User) s.get(User.class, student.getId());   

从一级缓存中取数据的操作get、load、list

[java] view
plain copy

User user=(User) s.get(User.class, 45);                        

String hql="from User where id=45";    

User user2=(User) s.createQuery(hql).uniqueResult();      

System.out.println(stu2.getName());    


二级缓存和查询缓存

二级缓存是SessionFactory级别的全局缓存,它为每个类(或集合)提供缓存。凡是调用二级缓存的查询方法都会从中受益,比如load,list,iterate等方法(注意,get和find不使用缓存,直接访问数据库)。

开启条件:

1)hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider(这里指定了ehcache)

2)hbm.xml配置<cache usage="read-write"/>

3)ehcache.xml定义该类的cache

简单地说,二级缓存是用来保存类对象的,并且填充它的所有属性值。

查询缓存保存的是查询方法(list和iterate等)查询的sql语句和结果集,跟load这种装载对象的方法没有关系。也就是说,使用load方法,查询缓存不理睬。

并且这个结果集只是对象id列表,对象的其他属性值不保存。例如,list执行的时候,先根据查询缓存中的sql语句,获取对象id列表,然后再load(id)来取对象。

开启条件:

1) hibernate.cache.use_query_cache=true

2)Query或者Criteria使用时,设置setCacheable(true)

简单地说,查询缓存是用来保存sql执行后获取的对象id列表。下一次执行同一条sql时,可直接从查询缓存中获取到对象id列表。



查询缓存是只存储对象的id的,并不去存储真正的对象,查询缓存作为key值的是   hql语句+参数+分页。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: