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

来源:互联网 发布:魔兽世界官方小说软件 编辑:程序博客网 时间:2024/06/05 18:41

我们先看一下什么样的hibernate操作会将数据存入到一级缓存中去,当调用下边这些方法的时候会将数据存入到一级缓存中

一级缓存

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

[java] view plain copy
  1. User userOne=new User();    
  2. user.setName("名字");   
  3. //放入一级缓存    
  4. s.save(user);    
  5. //查询  
  6. User userTwo=(User) s.get(User.class, student.getId());   

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

[java] view plain copy
  1. User user=(User) s.get(User.class45);                        
  2. String hql="from User where id=45";    
  3. User user2=(User) s.createQuery(hql).uniqueResult();      
  4. 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语句+参数+分页。


0 0
原创粉丝点击