hibernate中的缓存问题与快照机制

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();

 

}

 

 

 

posted on 2018-02-10 15:49  lichangyun  阅读(214)  评论(0编辑  收藏  举报