《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

  • 时间:
  • 浏览:2
  • 来源:神彩排列三_彩神排列三官方

《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

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

总之,要想使某条Select查询支持二级缓存,你前要保证:

原文地址http://www.bieryun.com/1753.html

MyBatis并也有简单地对整个Application就只一有另一个 Cache缓存对象,它将缓存划分的更细,即是Mapper级别的,即每一有另一个 Mapper都上能拥一有另一个 Cache对象,具体如下:

1.MyBatis自身提供的缓存实现;

        2. 用户自定义的Cache接口实现;

FIFO:(First in first out),先进先出算法,由于缓存中的容量由于满了,这么会将最先进入缓存中的数据清除掉;

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

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

     对于每个Cache而言,都一有另一个 容量限制,MyBatis各供了各种策略来对Cache缓存的容量进行控制,以及对Cache中的数据进行刷新和置换。MyBatis主要提供了以下2个刷新和置换策略:

MyBatis的二级缓存是Application级别的缓存,它上能提高对数据库查询的速率,以提高应用的性能。本文将全面分析MyBatis的二级缓存的设计原理。

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

    MyBatis对二级缓存的设计非常灵活,它自己内部管理实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略如LRU,FIFO等等;另外,MyBatis还允许用户自定义Cache接口实现,用户是前要实现org.apache.ibatis.cache.Cache接口,只是 将Cache实现类配置在<cache  type="">节点的type属性上即可;除此之外,MyBatis还支持跟第三方内存缓存库如Memecached的集成,总之,使用MyBatis的二级缓存有一有另一个 选泽:

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

注:  上述的每一有另一个 Cache对象,总要一有另一个 自己所属的namespace命名空间,只是 会将Mapper的 namespace作为它们的ID;

   2. 该select一句话所在的Mapper,配置了<cache> 或<cached-ref>节点,只是 有效

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

     MyBatis定义了极少量的Cache的装饰器来增强Cache缓存的功能,如下类图所示。

LRU:(Least Recently Used),最近共要使用算法,即由于缓存中容量由于满了,会将缓存中最近做少被使用的缓存记录清除掉,只是 加在新的记录;

     MyBatis自身提供了丰厚的,只是 功能强大的二级缓存的实现,它拥有一系列的Cache接口装饰者,上能满足各种对缓存操作和更新的策略。

a.为每一有另一个 Mapper分配一有另一个 Cache缓存对象(使用<cache>节点配置);

        3.跟第三方内存缓存库的集成;

MyBatisApplication级别的二级缓存细分到Mapper级别,即对于每一有另一个 Mapper.xml,由于在其中使用了<cache> 节点,则MyBatis会为这一 Mapper创建一有另一个 Cache缓存对象,如下图所示:

CachingExecutorExecutor的接口的关系如下类图所示:

真是在Mapper中配置了<cache>,只是 为此Mapper分配了Cache对象,这不须表示当当.我 当当.我 使用Mapper中定义的查询一句话查到的结果总要放置到Cache对象之中,当当.我 当当.我 前要指定Mapper中的某条选泽一句话是否支持缓存,即如下所示,在<select> 节点中配置useCache="true"Mapper才会对此Select的查询支持缓存特征,只是 ,不用对此Select查询,不用经过Cache缓存。如下所示,Select一句话配置了useCache="true",则表明这条Select一句话的查询会使用二级缓存。



   3. 该select一句话的参数 useCache=true

     Scheduled:指定时间间隔清空算法,该算法会以指定的某一有另一个 时间间隔将Cache缓存中的数据清空;

由于你想让多个Mapper公用一有另一个 Cache一句话,然后你使用<cache-ref namespace="">节点,来指定你的这一 Mapper使用到了哪一有另一个 MapperCache缓存。

      请注意,由于你的MyBatis使用了二级缓存,只是 你的Mapperselect一句话也配置使用了二级缓存,这么在执行select查询的过后,MyBatis会先从二级缓存中取输入,其次才是一级缓存,即MyBatis查询数据的顺序是: