hibernate--一级缓存和快照机制

缓存定义:

  内存中的临时数据,减少和数据库交互的次数,从而提高查询效率。

  使用缓存的数据:经常查询的,不经常修改。同时数据一旦出现问题,对最终结果影响不大。

  不适用缓存的数据:需要经常修改。并且由于使用缓存,对数据影响很大。(银行的汇率,库存的数据)

一级缓存:

  指Session对象的缓存,相同查询的条件,会在缓冲区调用,而不是再次访问数据库,一旦对象销毁了,缓存就会清除。

  Session对象按键值对的存储类型,key是全限定类名的字符串“com.bean.Customer.class ”,value是一个Map(key存的是OID,value存的是数据库对象)

  session.clear(),在关闭之前调用,可以清除缓存

代码测试

  @Test
    public void  cacheTest(){
        Session s= HibernateUtils.getSession();
        Transaction tx = s.beginTransaction();
        //一级缓存存入session对象,默认开启,当执行同样的查询时,只访问一次数据库
        Object c1 = s.get(Customer.class, 1);
        System.out.println(c1);
        Object c2 = s.get(Customer.class, 1);
        System.out.println(c2);
        tx.commit();
        s.close(); //session关闭,缓存也会清除
    }

测试结果

Hibernate: select customer0_.id as id0_0_, customer0_.name as name0_0_, customer0_.lovel as lovel0_0_ from customer customer0_ where customer0_.id=?
Customer [id=1, name=张飞, lovel=做县官]
Customer [id=1, name=张飞, lovel=做县官]

说明同样的查询条件,只访问了一次数据库。

 

快照机制:

@Test
public void kuaizhaoTest(){
Session s= HibernateUtils.getSession();
Transaction tx = s.beginTransaction();
//查询id为6的Customer
Customer c1 = (Customer)s.get(Customer.class, 6);
System.out.println(c1.getLovel());
//给id为6的Customer重设值
c1.setLovel("一生正气");
System.out.println(c1.getLovel());
//此事没有写update语句
Customer c2 = (Customer)s.get(Customer.class, 6);
System.out.println(c2);
tx.commit(); //快照区,会根据OID去数据库查数据,发现不一样的数据会,马上更新
s.close(); //session关闭,缓存也会清除
System.out.println(c1.getLovel());
}

输出结果

Hibernate: select customer0_.id as id0_0_, customer0_.name as name0_0_, customer0_.lovel as lovel0_0_ from customer customer0_ where customer0_.id=?
不爱人妻
一生正气
Customer [id=6, name=曹孟德, lovel=一生正气]
Hibernate: update customer set name=?, lovel=? where id=?
一生正气

得出:快照区,会根据OID去数据库查数据,发现不一样的数据会,会马上更新数据库;快照区在Session中,且程序员不能修改。

 

habernate中对象的状态:

  1.临时状态:没有OID,和没有关系。new Bean()。

  2.持久化状态:有OID,和Session没有关系。save/update

  3.托管状态:有OID,和Session没有关系。session.close()。

  4.删除状态:没有OID,和Session有关系。此时已经执行删除。

 

@Test
    public void  saveTest(){
        Customer customer = new Customer("刘备","十八玄孙");  //零时状态
        //1.使用工具获取Session
        Session s= HibernateUtils.getSession();
        Transaction tx = s.beginTransaction();
        s.save(customer);  //执行保存,持久状态
        //不会执行查询
        Customer customer2=(Customer) s.get(Customer.class,customer.getId());
        System.out.println("测试:"+customer2);
        tx.commit();
        s.close();
        //session关闭后,customer就会处于一个托管的状态,脱离session管理
        customer.setLovel("匡扶汉室");
        System.out.println(customer.getLovel());
        Session s1= HibernateUtils.getSession();
        s1.update(customer);  //执行保存再次转为持久化状态
        s1.close();
        System.out.println(customer);  //再次托管

    }

 

posted @ 2020-03-06 20:46  Jason–json  阅读(334)  评论(0)    收藏  举报