1. 什么是缓存
数据存储到数据库里面,数据库本身是一个文件系统,使用流方式操作文件(效率不高)
改进方式:把数据存到内存中,不需要使用流方式,可以直接读取内存中的数据
缓存:内存中的临时数据,当内存释放时,缓存消失。在读取数据时,先去缓存中查找,缓存中有就直接拿出,缓存中没有则再去数据库中查询
缓存的优点:降低IO读写、提高执行效率。
2. 一级缓存
Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库;如果没有找到相同OID值的对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。Hibernate的一级缓存的作用就是减少对数据库的访问次数(降低IO读写次数)。
Hibernate的一级缓存有如下特点:
Ÿ 一级缓存默认是打开状态
Ÿ 一级缓存的使用范围是session范围(从session创建到session关闭)
Ÿ 一级缓存中存储的数据必须都是持久态数据
测试:@Test
public void testCache(){
//从Hibernate封装的工具类中获取Session对象
Session session=HibernateUtil.openSession();
//开启事务
Transaction tx=session.beginTransaction();
//第一次执行get方法:一级缓存中无数据,会去数据库中查询
Customer c1=session.get(Customer.class, 100L);
System.out.println("One : "+c1);
//第二次执行get方法:一级缓存中有数据,直接获取缓存中的数据
Customer c2=session.get(Customer.class, 100L);
System.out.println("Two : "+c2);
System.out.println(c1==c2);//结果为true
tx.commit();
session.close();
}
Ÿ 两次get方法同一个对象 只有一个查询语句
3.快照机制:
Hibernate 向一级缓存放入数据时,同时复制一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库,并更新快照;如果一致,则不执行update语句。
结论:Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。
@Test
public void testUpdateName(){
//从Hibernate封装的工具类中获取Session对象
Session session=HibernateUtil.openSession();
//开启事务
Transaction tx=session.beginTransaction();
//第一步:先查询出客户信息(根据ID查询)
Customer c=session.get(Customer.class, 95L);
//第二步:对查询出的客户实体进行修改(修改名称)
c.setCustName("hello world");
//第三步:调用Hibernate方法实现更新操作
//session.update(c); //常规方式是要调用update方法,但此处省略看看执行结果
tx.commit();
session.close();
}