day37 02-Hibernate二级缓存:二级缓存的散装数据

一级缓存存放的是对象的地址。把对象的地址缓存下来了。二级缓存里面存放的是对象的散装数据。你再去获取的时候,因为一级缓存的生命周期结束了,它会从二级缓存中获取。从二级缓存中获取,因为它又会得到一个对象。它会把二级缓存中的散装数据拿出来重新组装成一个Customer对象。它相当于是这里又Custoerm c2 = new Customer();然后又调用c2.setCid(),c2.setCname(),c2.setAge()把id,name和age装进来。所以customer3和customer1得出来的地址肯定不一样嘛。因为customer3是一个新的对象了,跟custoemr1对象的地址又不一样了。所以二级缓存里面缓存的是对象的散装数据。

    @SuppressWarnings("unused")
    @Test
    // 配置二级缓存的情况
    public void demo2(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL.
        
        Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL.
        
        System.out.println(customer1 == customer2);
        
        tx.commit();//
        
        session = HibernateUtils.getCurrentSession();
        tx = session.beginTransaction();
        
        Customer customer3 = (Customer) session.get(Customer.class, 1);// 不发送SQL. 虽然是从二级缓存里获取的一个数据同时它也会往一级缓存里面放
        //因为上一个一级缓存已经结束了,这是另一个session的一级缓存了。所以customer4肯定是从一级缓存获取的
        Customer customer4 = (Customer) session.get(Customer.class, 1);// 不发送SQL.
        
        System.out.println(customer3 == customer4);//customer3和customer4肯定也是一样的
        System.out.println(customer1 == customer3);//Customer对象肯定是在二级缓存的类缓冲区里面的 那么二级缓存的类缓冲区是一个什么特点呢?二级缓存的类缓冲区卡里面存储的数据是
        //对象的散装数据  
        
        tx.commit();
    }
    
    
    @SuppressWarnings("unused")
    @Test
    // 没有配置二级缓存的情况
    public void demo1(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL.
        
        Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL.
        //一级缓存缓存的是对象的地址,cutoemr1和customer2指向的都是同一个地址
        System.out.println(customer1==customer2);
        
        tx.commit();
        
        session = HibernateUtils.getCurrentSession();
        tx = session.beginTransaction();
        
        Customer customer3 = (Customer) session.get(Customer.class, 1);// 发送SQL.
        
        
        tx.commit();
    }
}
原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6705680.html