美文网首页
二级缓存

二级缓存

作者: 打死你的小乌龟 | 来源:发表于2018-01-19 16:46 被阅读0次

数据特点

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

结构

二级缓存的生命周期

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

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

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

步骤在配置文件中
步骤1
         在hibernate的配置文件中开启二级缓存
步骤2
         在hibernate的配置文件中提供二级缓存的供应商
步骤3
         开启类级别的二级缓存
    <!-- 
        开启二级缓存
    -->
    <property name="cache.use_second_level_cache">true</property>

    <!-- 
        二级缓存的供应商
    -->
    <property name="cache.provider_class">
        org.hibernate.cache.EhCacheProvider
    </property>

    <!-- 
        开启了类级别的二级缓存
        usage  二级缓存的缓存策略 
        read-only
        可以把一个对象放入到二级缓存中,但是不能修改
        read-write
        可以把一个对象放入到二级缓存中,可以读可以改
        class  类的全名
    -->
    
<class-cache usage="read-only" class="com.hw.entity.Classes"/>

第二种方案 在映射文件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();
    }
    
二级缓存的统计机制

<property name="generate_statistics">true</property>

相关文章

网友评论

      本文标题:二级缓存

      本文链接:https://www.haomeiwen.com/subject/gmtaoxtx.html