hibernate的二级缓存

二级缓存是存放共有数据的,并且要求其中的数据修改次数尽可能的少,并且其生命周期与sessionFactory一致。
二级缓存一般应用与服务器开启的时候,读取配置信息,或者对于一款软件,读取其中的文档帮助信息,还有菜单信息。
那么,怎样使用二级缓存呢?
首先,二级缓存跟查询缓存都是hibernate默认关闭的,所以要在配置文件中打开,值得一提的是,在hibernate中,并没有提供解决二级缓存的方法,而是由第三方供应商来完成。常用的第三方供应商有:ehcache,oscache,jBosscache,ewamcache,在这4种组组件中,比较常用的是ehcache(不考虑分布式调用),jbosscache。所以,如果要使用二级缓存,要把其中一种组件的jar包导入

在Hibernate.cfg.xml中这样设置:

<!--  
        开启二级缓存
    -->
    <property name="cache.use_second_level_cache">true</property>
    <!--  
        提供第三方供应商
    -->
    <property name="cache.provider_class">
          org.hibernate.cache.EhCacheProvider
    </property>

然后把需要开启二级缓存的类,加载到配置文件中,其中有两种方法:
1、加载到hibernate.cfg.xml中:

<class-cache usage="read-only" class="cn.ansel.domain.Classes"/>

2、加载到相应的映射文件中:

<!-- 
    把这行代码写到id的上方
 -->
    <cache usage="read-only"/>

useage的取值跟数据库的安全机制的取值是一样的,有
这里写图片描述

配置文件配置完毕之后,接下来就是相应的测试了,首先我们按照需求来,那么save和update方法由于太少使用,我们就不测试,我们主要来测试load/get方法

/**
     * 我们先在session中获取一次,然后把session关闭之后,再获取一次
     * 如果第二次获取发出了sql说明get方法不能把数据放到二级缓存中
     * 如果没有发出,说明get方法也能把数据放到二级缓存中
     */
    @Test
    public void testGet(){
        Session session=sessionFactory.openSession();
        //获取数据
        Classes classes=(Classes) session.get(Classes.class, 1L);
        //关闭session
        session.close();
        //开启新的session
        session=sessionFactory.openSession();
        //再获取一次
        classes=(Classes) session.get(Classes.class, 1L);
        session.close();
    }

我们把断点设置在第一条classes.get语句,然后的debug
在经过第一行的session.get方法的时候,发出了sql语句
这里写图片描述

然后第二次经过session.get方法的时候,没有发出sql语句
这里写图片描述

这就说明了,session.get方法,在获取到数据之后,也把数据放在二级缓存中!

然后load的方法也是与上面大同小异,不过要注意在获取对象的时候,还要获取其中的属性才会发出sql语句!

如果在解决问题的过程中,我们遇到了读取非常庞大数量的数据时,庞大到以至于加载到内存中会影响运行的速度,这时候,我们可以考虑把读取的数据一部分放在内存中,另外一部分放在磁盘中,这样效率会大大增加
那么这样做的步骤为:
在项目的根目录下,添加一个eccache.xml文件,里面的内容为:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="C:\\TEMP1"/>
    <defaultCache
            maxElementsInMemory="12"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
            />
   <!--
        使用这个文件的时候,其他数据是可以复制的,在这里我们需要修改的时下面的name:对应的是我们要缓存的类的全名,还有maxElementsInMemory:表示内存中存储的对象最大数量, maxElementsOnDisk:磁盘中最多能存储多少个对象
    -->         
    <Cache
            name="cn.ansel.domain.Classes"
            maxElementsInMemory="5" 
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
            />
</ehcache>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值