SSM-MyBatis-17:Mybatis中二级缓存

Posted 晨曦Dawn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSM-MyBatis-17:Mybatis中二级缓存相关的知识,希望对你有一定的参考价值。

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

二级缓存

  Mybatis中,默认二级缓存是开启的。可以关闭。
  一级缓存开启的。可以被卸载吗?不可以的。一级缓存不可以卸载,天然和框架绑定。
内置二级缓存
    由于MyBatis从缓存中读取数据的依据与SQL的id相关,而非查询出的对象。所以,使用二级缓存的目的,不是在多个查询间共享查询结果(所有查询中只要查询结果中存在该对象,

    就直接从缓存中读取,这是对查询结果的共享,Hibernate中的缓存就是为了在多个查询间共享查询结果,但MyBatis不是),而是为了防止同一查询(相同的Sql id,相同的sql语句)的反复执行。

 

  一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其生命周期为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。

  二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache

  对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear

 

------------------------------------------------------------------------------------------------------------------------------------------------------------》

  内置二级缓存的使用简单配置步骤

      1.cacheEnabled=true;(这个默认值就是true,想用二级缓存可以不做配置,不想用改成false,在大配置中

 

<settings>
        <setting name="cacheEnabled" value="true"/><!--开启,他也是默认值-->
        <!--<setting name="cacheEnabled" value="false"/>--><!--关闭-->
    </settings>

 

      2.实体类实现序列化接口Serializeble

        由于我做的是关联查询,并且没有做延迟加载,所以俩个实体类都得实现Serializeble接口

      3.在接口同名的xml小配置中

        加入一个自闭和的<cache/>


------------------------------------------------------------------------------------------------------------------------------------------------------------》

  内置二级缓存存在性证明

  都已经知道一级缓存是sqlsession的级别,如果要是close掉,换成不同的sqlsession怎么办?

/*二级缓存*/
    @Test
    public void t4SecondCacheHasExist(){
        SqlSession session= MyBatisUtils.getSession();

        IDeptDAO mapper = session.getMapper(IDeptDAO.class);
        Dept depts = mapper.findDeptnoALLEmpsMoreSql(1);
        System.out.println(depts.getDeptName());
        session.close();

        System.out.println("===================我是高冷的分割线=====================");
        SqlSession session2= MyBatisUtils.getSession();

        IDeptDAO mapper2 = session2.getMapper(IDeptDAO.class);
        Dept depts2 = mapper2.findDeptnoALLEmpsMoreSql(1);
        System.out.println(depts2.getDeptName());
        session2.close();


    }

 

    运行结果

      

  但由于他对数据库只发了上面的sql,分割线后就没有去数据库去查找了,而sqlsession关闭掉了,并且又开了一个,说明二级缓存真的存在,是真的运用上了

 -----------------------------------------------------------------------------------》

  二级缓存参数配置

    在接口同名xml小配置中,可以指定具体的二级缓存参数配置

    我以代码加注释的方式来解释一波

 

    <!--
        eviction:清理缓存策咯,默认值LRU,最近最少使用先清除
        flushInterval:刷新间隔,默认不设置,就是永久
        size:对象,默认1024
        readOnly:只读,默认false
     -->
    <!--二级缓存-->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

 

 

     eviction:清理缓存策咯,默认值LRU,最近最少使用先清除,此处设置的FIFO是先进先出的队列形式,先进来的先清除
        flushInterval:刷新间隔,默认不设置,就是永久,单位毫秒
        size:对象,默认1024
        readOnly:只读,默认false

 

------------------------------------------------------------------------------------》

    二级缓存可以在一条sql语句上设置他的不开启-----------》局部关闭

    useCache改为false,不使用,不开启

    方法如下

 

    <!--设置二级缓存单条sql失效-->
    <select id="findDeptnoALLEmpsMoreSql" resultMap="DeptMoreSqlMapper" useCache="false">
        SELECT deptNo,deptName FROM dept WHERE deptNo=#{deptNo}
    </select>

 

 

 

-------------------------------------------------------------------------------------》

第三方的二级缓存引用---ehcache

  使用方式

    1.引入jar包,我给你们提供节点

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.4</version>
        </dependency>
        <!--MyBatis整合EhCache的包-->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.1.0</version>
        </dependency>    

 

    2.小配置中添加<cache/>具体配置,引用到第三方的缓存

 

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

 

    3.引入配置xml文件                       ehcache.xml                   名字一定这么取,别的不可以

      里面内容

 

<ehcache>

    <!-- Sets the path to the directory where cache .data files are created.

         If the path is a Java System Property it is replaced by
         its value in the running VM.

         The following properties are translated:
         user.home - User\'s home directory
         user.dir - User\'s current working directory
         java.io.tmpdir - Default temp file path -->
    <diskStore path="java.io.tmpdir"/>


    <!--Default Cache configuration. These will applied to caches programmatically created through
        the CacheManager.

        The following attributes are required for defaultCache:

        maxInMemory       - Sets the maximum number of objects that will be created in memory
        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
                            is never expired.
        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
                            if the element is not eternal. Idle time is now - last accessed time
        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
                            if the element is not eternal. TTL is now - creation time
        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
                            has reached the maxInMemory limit.

        -->
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />

    <!--Predefined caches.  Add your cache configuration settings here.
        If you do not have a configuration for your cache a WARNING will be issued when the
        CacheManager starts

        The following attributes are required for defaultCache:

        name              - Sets the name of the cache. This is used to identify the cache. It must be unique.
        maxInMemory       - Sets the maximum number of objects that will be created in memory
        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
                            is never expired.
        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
                            if the element is not eternal. Idle time is now - last accessed time
        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
                            if the element is not eternal. TTL is now - creation time
        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
                            has reached the maxInMemory limit.

        -->

    <!-- Sample cache named sampleCache1
        This cache contains a maximum in memory of 10000 elements, and will expire
        an element if it is idle for more than 5 minutes and lives for more than
        10 minutes.

        If there are more than 10000 elements it will overflow to the
        disk cache, which in this configuration will go to wherever java.io.tmp is
        defined on your system. On a standard Linux system this will be /tmp"
        -->
    <cache name="sampleCache1"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />

    <!-- Sample cache named sampleCache2
        This cache contains 1000 elements. Elements will always be held in memory.
        They are not expired. -->
    <cache name="sampleCache2"
        maxElementsInMemory="1000"
        eternal="true"
        timeToIdleSeconds="0"
        timeToLiveSeconds="0"
        overflowToDisk="false"
        /> -->

    <!-- Place configuration for your caches following -->

</ehcache>

 

    接着我们调用刚才二级缓存存在性证明的那个方法,测试引用到了第三方框架ehcache了没

    运行结果

    看到这个表示成功

    Cache Hit Ratio  缓存命中率

 

 

 

--------------------------------孤傲的程序员------------------------------------------------------------------------------------------------

 

以上是关于SSM-MyBatis-17:Mybatis中二级缓存的主要内容,如果未能解决你的问题,请参考以下文章

mybatis二级缓存原理

Mybatis基于注解开启使用二级缓存

MyBatis学习13MyBatis中的二级缓存

mybatis 源码分析一二级缓存分析

MyBatis的二级缓存

Mybatis的二级缓存注意点