• Hibernate 之 二级缓存


    在上篇文章中我们对缓存以及Hibernate的一级缓存进行了介绍,接下来的主要内容将是Hibernate的二级缓存.

           二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,换句话说就是一级缓存可以用二级缓存里的内容.二级缓存的生命周期和SessionFactory(重量级,一个数据库一个SessionFactory)的生命周期一致,SessionFactory可以管理二级缓存.

           二级缓存在Hibernate中有自己的实现叫做HashTable,但是不建议用它进行商用,可以用来进行测试.Hibernate的二级缓存有专门的缓存策略提供商(Cache Providers),例如EHCache,OSCache.在这篇文章中我们主要介绍一下Hibernate二级缓存EHCache的用法.

        

    计算机生成了可选文字:表19.1.媛存策略提供内(Caoh.Provider:)Cach.R七址ablecla。。Clust.rSaf.Cach.S即port,d八三一盈月口七eeyyy(not毗endedforproductionu:e)org.h止ernate.cache.HashtableCacheprov:derEHCacheOSCac址org.hib已rnate.cach已.Ehcac比Provid已rorg.b止ernate.c.che.的CacheProvlderorg.h止ernate.c.che.s.ar戒。cheProviderT冲em巴UOry孙etnory,山skmemory.违skc嘛ered仲m“七CaBt)c协tered卯m川。cast),yes(clustered见055TreeCacheorg.h劝ernate.cache.众eeCacheProv工der七都acoon已yes(r印五c的。n)yes(cfocks卯creq)

          二级缓存EHCache的配置和使用.

    *ehcache.xml文件拷贝到src(Hibernate3etcehcache.xml路进行.hibernate相关的例子中找配置文件)如下图:

    计算机生成了可选文字:口D\,haxe�7)比.r.ot.kiber抽t一32D小\kiberna忆一32.tc大小,}l类纽文件川L皿0创踢L劝。创rR【了云石」1T!.矛以n双L劝0创PR【护!卫丁1PRO了艺五」1艺日Lno创口助口KB助助口KB口s月1巧“u,2se牛和文件夹任务刁,命名这个文件移枷名个文件复饱始个文件将这个文件发布到,介紧袖服雄洲打筋客个文件姗!除这个文件名称‘当cvrJ,lr一。1一〔t二.r.1口困困刀颐习小,卜.rn。、.c几一1鱼l,[。rna,.妙。p.r,1.:画‘:b,。‘t.Pro,.rt:.,t一,i.t.月、豆ber。。,一:,v:。.戚画10内,r。,,t:。.画ose.h.,r,ert,。:月tr“。‘比。耐

     

    默认配置.

    <defaultCache

           maxElementsInMemory="10000"

           eternal="false"

           timeToIdleSeconds="120"

           timeToLiveSeconds="120"

           overflowToDisk="true"

           />

    配置的解释如下:

     <!--缺省配置 可以对类进行单独配置-->

            <!--最大对象数目 -->

            <!--是否过期 -->

            <!--多长时间没有被访问 -->

            <!--如果超过限制,则放入磁盘中 -->

     

    可以进行单独配置

     <cache name="sampleCache2"

           maxElementsInMemory="1000"

           eternal="true"

           timeToIdleSeconds="0"

           timeToLiveSeconds="0"

           overflowToDisk="false"

           />

    *hibernate.cfg.xml文件中加入缓存产品提供商

    <propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

    * 启用二级缓存,这也是它的默认配置,hibernate.cfg.xml配置文件中进行启动二级缓存配置.

    <propertyname="hibernate.cache.use_second_level_cache">true</property>

    *指定哪些实体类使用二级缓存

    可以在映射文件中采用<cache>标签指定或在hibernate.cfg.xml文件中统一指定

    注意使用的策略,通常采用read-only和read-write.

    例如在配置文件中统一进行配置.(此处笔者将对Student类进行配置)

    <class-cacheusage="read-only" class="com.tgb.hibernate.Student"/>

    *以上便完成了EHCache的基本配置,接下来便是在具体的代码中运用

     例如在两个Session中发Load查询,因为我们配置了二级缓存,所以在第二次Load的过程中不在发出查询语句,而是直接从二级缓存中获取数据.

    测试代码如下:

     

     

    1. /** 
    2.  * 二级缓存测试代码 
    3.  *  
    4.  */  
    5.   
    6. public class CacheTest extends TestCase {  
    7.   
    8.     /** 
    9.      * 开启二级缓存 
    10.      * 在两个session中发load查询 
    11.      */  
    12.     public void testCache() {  
    13.         Session session = null;  
    14.         try {  
    15.             //获取session  
    16.             session = HibernateUtils.getSession();  
    17.             //开启事务  
    18.             session.beginTransaction();  
    19.             //第一次用load查询id为1的学生  
    20.             Student student = (Student)session.load(Student.class1);  
    21.             System.out.println("student.name=" + student.getName());  
    22.             //提交  
    23.             session.getTransaction().commit();  
    24.         }catch(Exception e) {  
    25.             e.printStackTrace();  
    26.             session.getTransaction().rollback();  
    27.         }finally {  
    28.             HibernateUtils.closeSession(session);  
    29.         }  
    30.           
    31.         try {  
    32.             session = HibernateUtils.getSession();  
    33.             session.beginTransaction();  
    34.             第二次用load查询id为1的学生  
    35.             Student student = (Student)session.load(Student.class1);  
    36.               
    37.             //不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据  
    38.             //二级缓存是进程级的缓存  
    39.             System.out.println("student.name=" + student.getName());  
    40.             session.getTransaction().commit();  
    41.         }catch(Exception e) {  
    42.             e.printStackTrace();  
    43.             session.getTransaction().rollback();  
    44.         }finally {  
    45.             HibernateUtils.closeSession(session);  
    46.         }  
    47.           
    48.     }         
    49.   
    50. }  

     

       以上便是Hibernate二级缓存EHCache产品的使用方式.当然二级缓存有着自己适用的场景.

     

        适合存放到第二级缓存中的数据?

    1很少被修改的数据

    2不是很重要的数据,允许出现偶尔并发的数据

    3不会被并发访问的数据

    4参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

         不适合存放到第二级缓存的数据?

    1经常被修改的数据

    2财务数据,绝对不允许出现并发

    3与其他应用共享的数据。

     

     总结

           缓存是为性能而生,但不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,在不了解原理的情况下乱用,可能会有N+1的问题。不当的使用还可能导致读出脏数据。

     

  • 相关阅读:
    Maven 项目管理工具基础入门系列(二)
    Python OJ 从入门到入门基础练习 10 题
    Maven 项目管理工具基础知识系列(一)
    Markdown 编辑器使用指南
    解决:GitHub 远程端添加了 README.md 文件后,本地 push 代码时出现错误
    CentOS7.4搭建基于用户认证的MongoDB4.0三节点副本集集群详细文档
    Redhat 6.7 x64升级SSH到OpenSSH_7.4p1完整文档
    RHEL6.7 x64双节点安装Oracle 11g R2 RAC
    局域网下通过代理实现服务器的互联网访问
    RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA
  • 原文地址:https://www.cnblogs.com/baoendemao/p/3804807.html
Copyright © 2020-2023  润新知