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

     

    }

     

     

     

    今天要比昨天好
  • 相关阅读:
    基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类
    基于Java+Selenium的WebUI自动化测试框架(三)------记录LOG
    基于Java+Selenium的WebUI自动化测试框架(二)-----页面操作接口
    基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器
    疯狂java笔记(七)
    使用python实现栈和队列
    Android定位方式和测试方法
    Robotium原理初探
    Android内存进程管理机制
    疯狂java笔记(五)
  • 原文地址:https://www.cnblogs.com/lichangyun/p/8438971.html
Copyright © 2020-2023  润新知