Hibernate学习16(二级缓存)

一级不会跨Session Session关闭缓存消失
二级缓存 SessionFactory缓存
  • 1.内置缓存:映射文件保存

  • 2.外置缓存:存放缓存的数据

适合放的数据:
  • 1.很少修改的

  • 2.不是很重要,有并发

步骤:
  • 1.加入jar(都在hibernate文件中)
ehcache
  • 2.加入ehcache.xml配置文件 (都在hibernate文件中)
<ehcache>
    <!-- 配置磁盘缓存路径 -->
    <!-- SessionFactory关闭时目录文件会被删除 -->
    <diskStore path="java.io.tmpdir"/>


   <!-- 默认的缓存数据过期策略 -->
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />

   <!-- 设置具体命名缓存的过期策略,每个命名缓存代表一个缓存区域 -->
   <!-- 缓存区域:一个具有名称的缓存块,可以给缓存快块设置不同的缓存策略,
                  没有设置使用默认的 
        hibernate在不同的缓存区域保存不同的类/集合
            类:区域的名称是全类名
            集合:区域名是全类名加属性名
   -->
   
    <cache name="hql.Employee"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />
        
        <!-- 
        name:设置缓存名
        maxElementsInMemory:可以在内存缓存中可存放的对象最大数目
        eternal:设置对象是否是永久的,true表示永不过期,忽略timeToIdleSeconds timeToLiveSeconds属性
        timeToIdleSeconds:对象空闲最大时间,秒为单位 对象没有在这个时间类被使用会被清除
        timeToLiveSeconds:设置对象最大生存时间,超过这个时间对象会被清除,0表示无限期
        overflowToDisk:缓存数达到内存中最大时,是否把多余的数据存放到磁盘缓存中
         -->
        
     <cache name="hql.Department.employees"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />
    <cache name="sampleCache2"
        maxElementsInMemory="1000"
        eternal="true"
        timeToIdleSeconds="0"
        timeToLiveSeconds="0"
        overflowToDisk="false"
        /> -->
</ehcache>
  • 3.hibernate.cfg.xml 配置
    1).开启缓存
    2).配置二级缓存产品(ehcache)
    3).配置需要缓存持久化类 和缓存策略
        <!-- 启用二级缓存 -->
        <property name="cache.use_second_level_cache">true</property>
        <!-- 配置使用二级缓存产品 ehcache-->
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
        <!-- 设置启用查询缓存 -->
        <property name="cache.use_query_cache">true</property>
        
        <mapping resource="hql/Department.hbm.xml" />
        <mapping resource="hql/Employee.hbm.xml" />
        <mapping resource="chen/House.hbm.xml" />
        <mapping resource="chen/User.hbm.xml" />
        
        
        <!-- 配置那个持久化类启用二级缓存 -->
        <class-cache usage="read-write" class="hql.Employee"/> 
        <!-- 缓存集合属性 -->
        <class-cache usage="read-write" class="hql.Department"/>
        <!-- 设置集合属性为二级缓存 没有缓存集合中元素使这样设置只会缓存OID-->
        <collection-cache usage="read-write"  collection="hql.Department.employees"/>
        
夸SessionFactory缓存调用
    /**
     * 二级缓存
     * 一级不会跨Session Session关闭缓存消失
     * 二级缓存SessionFactory 缓存
     *      1.内置缓存:映射文件保存
     *      2.外置缓存:存放缓存的数据
     * 
     * 适合放的数据:
     * 1.很少修改的
     * 2.不是很重要,有并发
     * 
     * 步骤
     * 1.加入jar(都在hibernate文件中)
     * 2.加入ehcache.xml配置文件 (都在hibernate文件中)
     * 3.hibernate.cfg.xml 配置
     *      1).开启缓存 
     *      2).配置二级缓存产品(ehcache)
     *      3).配置需要缓存持久化类 和缓存策略
     * */
    public static void cache() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Employee employee1=session.get(Employee.class, 1);
        System.out.println(employee1.getName());
        
        transaction.commit();
        session.close();
        session=null;
        transaction=null;
        
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
        Employee employee2=session.get(Employee.class, 1);
        System.out.println(employee2.getName());
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
集合二级缓存
  • 在hibernate.cfg.xml 配置要配置元素中的持久化类配置二级缓存
  • 在hibernate.cfg.xml 配置集合
查询缓存 默认无效
  • 1.默认情况下 设置的缓存对HQL QBC查询时无效的
步骤:
  • 1.在hibernate.cfg.xml文件声明开启查询缓存

  • 2.显示调用query.setCacheable(true);

  • 3.查询缓存依赖二级缓存

    /**
     * 集合二级缓存 查询缓存
     * 1.默认情况下 设置的缓存对HQL QBC查询时无效的
     * 步骤:
     * 1.在hibernate.cfg.xml文件声明开启查询缓存
     * 2.显示调用query.setCacheable(true);
     * 3.查询缓存依赖二级缓存
     * */
    public static void cacheQuery() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        String hql = "FROM Employee ";
        Query query = session.createQuery(hql);
        query.setCacheable(true);
        
        List<Employee> es = query.list();//第一次查询
        System.out.println(es.size());
        List<Employee> es2 = query.list();//二次查询
        
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
更新时间戳缓存
    /**
     * 更新时间戳缓存
     * 缓存被修改时 更新缓存
     * */
    public static void cacheData() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        String hql = "FROM Employee ";
        Query query = session.createQuery(hql);
        query.setCacheable(true);
        
        List<Employee> es = query.list();//第一次查询
        Employee e = session.get(Employee.class, 1);
        e.setName("我改了");
        System.out.println(es.size());
        List<Employee> es2 = query.list();//二次查询
        
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容