• hibernate 5的二级缓存案例讲解


    本帖最后由 鱼丸儿 于 2018-1-20 11:44 编辑

    大家好,今天来记录讲解一下磕磕绊绊的hibernate5 的二级缓存配置,一条路摸到黑 
    那么在这之前我们先了解一下hibernate的一级缓存和二级缓存分别是什么? 
    说句通俗的话就是 一级缓存的信息只能在同一个session间传递,而二级缓存是不同的session间可以访问的,可以跨越Session存在,可以被多个Session所共享。需要第三方缓存框架的加持 

    那么什么数据适合放到二级缓存中呢? 
    便是那些不经常改动又经常被访问的数据,比如省市信息等,前台页面经常查询而没必要每次都要去数据库查询! 

    那么有什么三方框架可以支持hibernate的二级缓存呢?
     
    EHCache: 可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持 
    OpenSymphony:可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持 
    SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存 
    JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存 

    好,那么我们接下来就以EHCache来介绍一下hibernate二级缓存的用法 

    第一步:导入jar包(jar包附件给出) 
    [Java] 纯文本查看 复制代码
    1
    2
    3
    ehcache-core-2.4.3.jar 
    hibernate-ehcache-5.0.7.Final.jar 
    commons-logging-1.1.1.jar


    第二步:声明缓存(在hibernate.cfg.xml 中配置) 
    [XML] 纯文本查看 复制代码
    1
    2
    3
    4
    5
    6
    7
    <!-- 使用二级缓存 --> 
    <property name="hibernate.cache.use_second_level_cache">true</property
    <!--设置缓存的类型,设置缓存的提供商 --> 
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property
    <!--但是在 hibernate 4中设置缓存提供商时是这样设置的 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>--> 
    <property name="hibernate.cache.use_query_cache">true</property>


    第三步:需要设置EHCache配置文件 
    [XML] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" 
       
     <diskStore path="C:/ehcache"/><!-- 需要在你的磁盘里面添加该目录 --> 
             <defaultCache     
                maxElementsInMemory="10000"  
                eternal="false"   
                timeToIdleSeconds="120"  
                timeToLiveSeconds="120"  
                overflowToDisk="true"  
                maxElementsOnDisk="10000000"  
                diskExpiryThreadIntervalSeconds="120"   
                memoryStoreEvictionPolicy="LRU"    
                />   
    </ehcache>


    第四步:指定什么对象也就是model可以加入缓存 
    有两种配置方式,可以在hbm中创建安,也可以在cfg文件中创建 
    我们这里就以cfg文件配置为例 

    [XML] 纯文本查看 复制代码
    1
    2
    3
    4
    <class-cache usage="read-write" class="cn.patronli.domain.Order"/> <!-缓存的是对象- 
    <collection-cache usage="read-write" collection="cn.patronli.domain.Customer.orders"/> <!-缓存的是集合- 
       
    为了保险起见 我们需要给相对应的model  实现一个序列化接口 implements Serializable


    那么如何在hbm中设置呢?需要再class后紧跟缓存配置,如下所示 
    [XML] 纯文本查看 复制代码
    1
    2
    <class name="Customer" table="t_customer" catalog="hibernateTest" lazy="true"
        <cache usage="read-write"/>


    以上配置二选一 !!!! 

    那么最后我们就可以来进行测试了 
    [Java] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    public static void main(String[] args) {   
                 
            Session s1 = HibernateUtils.openSession(); 
            s1.beginTransaction();   
            Customer c1 = (Customer) s1.get(Customer.class, 1); // 从数据库中加载数据   
            System.out.println(c1.getName()); 
            s1.getTransaction().commit();   
            s1.close(); // 关闭session级别的一级缓存   
         
            Session s2 = HibernateUtils.openSession(); 
            s2.beginTransaction();   
            Customer c2 = (Customer) s2.get(Customer.class, 1); // 因为有了二级缓存的存在,并不会去查询数据库可以debug  观察控制台打印 
            System.out.println(c2.getName());   
        }


    不知道你学会了没有?
  • 相关阅读:
    洛谷P2192HXY玩卡片
    洛谷P1876开灯
    洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
    洛谷 P2059 [JLOI2013]卡牌游戏(概率dp)
    洛谷 P3380 【模板】二逼平衡树(树套树)
    洛谷 P3157 [CQOI2011]动态逆序对(树套树)
    CF914E Palindromes in a Tree(点分治)
    洛谷 P2542 [AHOI2005]航线规划(Link-cut-tree)
    洛谷 P2495 [SDOI2011]消耗战(虚树,dp)
    洛谷 P4036 [JSOI2008]火星人(splay+字符串hash)
  • 原文地址:https://www.cnblogs.com/bigben0123/p/8968949.html
Copyright © 2020-2023  润新知