Hibernate缓存

一 缓存作用
缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。

二 缓存分类
一级缓存,Session级共享。    
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。
二级缓存, SessionFacotry级共享

三 一级缓存原理示例
Hibernate缓存
从上图看出: 当我们去查询对象的时候,首先到一级缓存去取数据,如果有,则不到数据库中取,如果没有则到数据库中取,同时在一级缓存中放入对象。

四 什么操作会向一级缓存放入数据
save,update,saveOrUpdate,load,get,list,iterate,lock
save 案例:
//添加一个学生
Student student=new Student();
student.setName("小东");
s.save(student);//放入一级缓存
//马上查询
Student stu2=(Student) s.get(Student.class, student.getId()); //select
System.out.println("你刚刚加入的学生名字是"+stu2.getName());
Hibernate缓存

五 什么操作会从一级缓存取数据
get/load/list
get/load会首先从一级缓存中取,如没有,再有不同的操作
get会立即向数据库发请求。
load会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求。
list不会从session缓存取数据
案例:
//查询45号学生
Student stu=(Student) s.get(Student.class, 45);
System.out.println("|||||||||||||||||||");
String hql="from Student where id=45";
Student stu2=(Student) s.createQuery(hql).uniqueResult();
System.out.println(stu2.getName());
从上面的案例,看出query.list(),query.uniueResut()不会从一级缓取数据。
但是query.list或者query.uniqueRestu()会向一级缓存放数据的。

六 一级缓存不需要配置
它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者 clear来清除session缓存中对象。evict是清除一个对象,clear是清除所有的sesion缓存对象。

七 一级缓存生命周期
session级缓存中对象的生命周期, 当session关闭后,就自动销毁。