Mybatis 二级缓存的使用

Mybatis二级缓存

  • 简介:二级缓存是namesace级别的,多个SqlSession去操作同个namespace下的Mapper的sql语句,多个SqlSession可以共用二级缓存,如果两个mapper的namespace相同,(既使是两个mapper,那么这两个mapper中执行sql查询的数据也将存在相同的二级缓存区域中,但是最后是每个Mapper单独的命名空间)
  • 基于PerpetualCache的HashMap本地缓存,可自定义存储源,如Ehcacche/Redis等
  • 默认没有开启二级缓存
  • 操作流程:第一次调用某个namespacce下的SQL去查询信息,查询到的信息会存放该mapper对应的二级缓存区域。第二次调用同个namespace下的mapper映射文件中,相同的sql去查询信息,会去对应的二级缓存内取结果

失效策略

  执行同个namespace下的mapper映射文件中增删改sql,并执行了commit操作,会清空该二级缓存

注意:实现二级缓存的时候,Mybatis建议返回的POJO是可序列化的,也就是建议实现Serializable接口

缓存淘汰策略:会使用默认的LRU算法来收回(最近最少使用的)

开启缓存

如何开启某个二级缓存mapper.xml里面配置

    <!--开启Mapper的namespace下的二级缓存-->
    <!--
        eviction:代表的是缓存回收策略,常见下面两种
        1)、LRU,最近最少使用的,移除最长时间不用的对象
        2)、FIFO,先进先出,按对象进入缓存的顺序来移除他们
        flushInterval:刷新间隔时间,单位为毫秒,这里配置的是10秒,如果不配置他,当SQL被执行的时候才会去刷新缓存
        size:引入数目,代表缓存最多可以存储多少个对象,设置过大会导致内存溢出
        readOnly:只读,缓存数据只能读取不能修改,默认值为false
    -->
    <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"></cache>

全局配置

    <!--全局配置-->
    <settings>
        <!--这个配置使全局的映射器(二级缓存)启用或禁用缓存,全局总开关,这里关闭,mapper中开启了也没用-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

一级缓存和二级缓存使用顺序

优先查询二级缓存==》查询一级缓存==》数据库

控制某个方法不走二级缓存

在标签中添加 useCache="false"

    <select id="queryUserOrder" resultMap="UserOrderResultMap" useCache="false">
    select
        u.id,
        u.name,
        u.pwd,
        u.phone,
        u.head_img,
        v.id idv,
        v.out_trade_no,
        v.create_time,
        v.state,
        v.total_fee,
        v.video_id,
        v.video_title,
        v.video_img
    from user u left join video_order v on u.id = v.user_id
    </select>
原文地址:https://www.cnblogs.com/chenyanbin/p/13296267.html