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

时间:2022-08-04 00:47:53

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

一级缓存

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

User userOne=new User();  
user.setName("名字");
//放入一级缓存
s.save(user);
//查询
User userTwo=(User) s.get(User.class, student.getId());

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

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列表。

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

查询缓存是只存储对象的id的,并不去存储真正的对象,查询缓存作为key值的是   hql语句+参数+分页。