二级缓存

数据特点

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>

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、简介 二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。...
    yjaal阅读 5,138评论 0 1
  • 什么是二级缓存二级缓存在hibernate中对应为SessionFactory范围的缓存,通常来讲sessionf...
    我相信你爱过gg阅读 3,471评论 0 1
  • Hibernate 二级缓存 Hibernate 二级缓存 总结整理 可以在进程或集群的级别上为事务之间可重用的数...
    WesleyLien阅读 3,165评论 0 0
  • 9.1 姓名:韩艾辰 第7天 【学习:30分钟】 【冥想:13分钟】每天多次冥想 【瑜伽:0分钟】 【三时书:2...
    韩艾辰阅读 1,292评论 0 0
  • 最近总是熬夜,也不想工作。不知道为什么,很低迷很难受。 真的要热爱生活!!热爱生活,才会对自己好,享受生活。
    醉梦长安阅读 1,499评论 0 0

友情链接更多精彩内容