hibernate学习hibernate的一级缓存&快照

Posted 变局

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate学习hibernate的一级缓存&快照相关的知识,希望对你有一定的参考价值。

缓存:提高效率   

 硬件的 CPU缓存   硬盘缓存   内存   

 软件的  io流缓存  

hibernate  的一级缓存   也是为了操作数据库的效率。

 

证明一级缓存在  :

Person p=session .get(Person.class, 1);

Person p1=session.get(Person.class,2);

Person  p2=session.get(Person.class,3);

System.out.println(p=p1);

 

控制台输出为:

    select   *   from    person where  id=1;

         true  

 

缓存原理:

 

 快照 

当代码变为:

  注:原始数据库person表中的第一条数据的name值为 "张三"

  Person  p=session.get(Person.class,1);

  p.setName("zhangsan");

   p.setName("张三");

  执行后控制台上显示为  

  select  * from   person where id=1;  

查看数据库person表中的数据    id为1 name="张三"

 

这里就运用到了hibernate 的快照:

 

 

提高效率:   1.提高查询效率  (缓存原理) 2.减少不必要的修改语句发送  (快照)

从缓存上看  hibernate对象状态 :

    1.瞬时状态  :没有id  ,没有在session缓存中

    2.持久化状态:  有id  ,在session缓存中 

    3. 游离/托管 状态   :有id 没与在缓存中

 

对快照的更深一步了解  : 以下代码 截取测试方法中的部分主要的代码

  .........

  Person   p=new Person(); // 瞬时状态

       p.setId(1); //  游离状态 , 有id没有在session中缓存

  session.update(p);  // 持久化状态  ,有id  在session中缓存

  Person  p=session.get(Person.class,  1);

  tx.commit();

  .........

在person p =new Person();   设置一个断点   ,debug模式执行查看控制台中的SQL语句显示

直至运行到Person   p= session.get(Person.class ,1);   控制台输出  update   Person   set   name=?  age= ?   sex=?     where  id=?

出现该现象的原因是  :  对象是通过update  变为持久化状态   ,没有通过get方法  把对象放入快照中  ,

当  事物提交中后  会执行  第九步:对象和快照中的对象进行比对, 如果不相同就执行update 语句   ;  没有快照也就不相同所以就执行update语句  

以上是关于hibernate学习hibernate的一级缓存&快照的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate学习笔记 — Hibernate 的一级缓存意义

Hibernate基础学习2

hibernate学习——对象状态与一级缓存

Hibernate学习11——配置Hibernate二级缓存

hibernate学习 六 Hibernate缓存

hibernate框架学习之一级缓存