• 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语句  

  • 相关阅读:
    Java字符串比较
    Java中定义不了可变长数组怎么办---集合 泛型
    Java后台读取excel表格返回至Web前端
    JAVA中Stringbuffer的append( )方法
    Java操作Excel中HSSFCell.CELL_TYPE_STRING、BOOLEAN、NUMERIC无定义解决方法
    数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)
    .getCellType()的几种类型值
    数据结构---公交线路提示系统04
    数据结构---公交线路提示系统03
    转载一篇较为详细的caffe-ssd编译环境的搭建
  • 原文地址:https://www.cnblogs.com/shaoxiaohuan/p/7919831.html
Copyright © 2020-2023  润新知