二级缓存

数据特点

1、公共的数据
2、不经常修改的数据
3、私密性不是很高的数据

结构

二级缓存的生命周期

当hibernate程序开始的时候,二级缓存就存在了,当hibernate容器销毁的时候,
二级缓存就销毁了。

hibernate内部没有提供二级缓存的实现

默认情况下,利用的是ehcache。

步骤在配置文件中
步骤1
         在hibernate的配置文件中开启二级缓存
步骤2
         在hibernate的配置文件中提供二级缓存的供应商
步骤3
         开启类级别的二级缓存
    
    true

    
    
        org.hibernate.cache.EhCacheProvider
    

    
    

第二种方案 在映射文件Classes.hbm.xml文件中

类级别的操作

    /**
     * session.get方法把对象放入到了二级缓存中
     *     先从一级缓存中查找数据,再从二级缓存中查找数据,最后从数据库中查询数据
     *        把查找出来的数据放入到一级和二级缓存中
     */
    @Test
    public void testGet(){
        Session session = sessionFactory.openSession();
        Classes classes = (Classes)session.get(Classes.class, 1L);
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
        session.close();//一级缓存的数据没有了
        session = sessionFactory.openSession();
        classes = (Classes)session.get(Classes.class, 1L);
        session.close();
    }
    
    /**
     * save方法
     *    save方法不能把对象放入到二级缓存中
     */
    @Test
    public void testSave(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        Classes classes = new Classes();
        classes.setName("aaa");
        session.save(classes);
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
        transaction.commit();
        session.close();
        
        session = sessionFactory.openSession();
        Classes classes2 = (Classes)session.get(Classes.class, classes.getCid());
        session.close();
    }
    
    /**
     * session.update方法也不能把对象放入到二级缓存中
     */
    @Test
    public void testUpdate(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Classes classes = new Classes();
        classes.setCid(1L);
        classes.setName("aaa");
        session.update(classes);
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
        transaction.commit();
        session.close();
    }
    
    /**
     * list方法
     *   list方法可以把对象放入到二级缓存中
     */
    @Test
    public void testList(){
        Session session = sessionFactory.openSession();
        session.createQuery("from Classes").list();
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount());//输出有值
        session.close();
    }
    
二级缓存的统计机制

true

你可能感兴趣的:(二级缓存)