MyBatis二级缓存原理解析

作者: 匠丶 | 来源:发表于2018-12-05 22:10 被阅读144次

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。

    什么是二级缓存


    如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。



    CachingExecutor是Executor的装饰者,以增强Executor的功能,使其具有缓存查询的功能,这里用到了设计模式中的装饰者模式,

    二级缓存的使用

    MyBatis并不是简单地对整个Application就只有一个Cache缓存对象,它将缓存划分的更细,即是Mapper级别的,即每一个Mapper都可以拥有一个Cache对象,具体如下:
    a.为每一个Mapper分配一个Cache缓存对象(使用<cache>节点配置);

    b.多个Mapper共用一个Cache缓存对象(使用<cache-ref>节点配置);

    MyBatis对二级缓存的支持粒度很细,它会指定某一条查询语句是否使用二级缓存。

    虽然在Mapper中配置了<cache>,并且为此Mapper分配了Cache对象,这并不表示我们使用Mapper中定义的查询语句查到的结果都会放置到Cache对象之中,我们必须指定Mapper中的某条选择语句是否支持缓存,即如下所示,在<select> 节点中配置useCache="true",Mapper才会对此Select的查询支持缓存特性,否则,不会对此Select查询,不会经过Cache缓存。如下所示,Select语句配置了useCache="true",则表明这条Select语句的查询会使用二级缓存。

    <select id="selectByMinSalary" resultMap="BaseResultMap" parameterType="java.util.Map" useCache="true">
    

    要想使某条Select查询支持二级缓存,需要保证:

    1. MyBatis支持二级缓存的总开关:全局配置变量参数 cacheEnabled=true

    2. 该select语句所在的Mapper,配置了<cache> 或<cached-ref>节点,并且有效

    3. 该select语句的参数 useCache=true

    请注意,如果MyBatis使用了二级缓存,并且你的Mapper和select语句也配置使用了二级缓存,那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存,即MyBatis查询数据的顺序是:

    二级缓存 ———> 一级缓存——> 数据库

    相关文章

      网友评论

        本文标题:MyBatis二级缓存原理解析

        本文链接:https://www.haomeiwen.com/subject/ivjgcqtx.html