《深刻理解mybatis原理》 MyBatis缓存机制的设计与实现

        本文主要讲解MyBatis很是棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,而后会分别针对缓存机制中的方方面面展开讨论。
数据库

MyBatis将数据缓存设计成两级结构,分为一级缓存、二级缓存:apache

       一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认状况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,能够经过开发插件对它进行修改);缓存

       二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期同样,也就是说它的做用范围是整个Application应用。mybatis

  

  MyBatis中一级缓存和二级缓存的组织以下图所示:
性能

 一级缓存的工做机制:ui

      一级缓存是Session会话级别的,通常而言,一个SqlSession对象会使用一个Executor对象来完成会话操做,Executor对象会维护一个Cache缓存,以提升查询性能。关于一级缓存的详细实现,我已经在《深刻理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项 一文中有很是详尽的讨论,读者能够前去了解。lua

二级缓存的工做机制:spa

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

     MyBatis的二级缓存设计得比较灵活,你可使用MyBatis本身定义的二级缓存实现;你也能够经过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可使用第三方内存缓存库,如Memcached等,这个咱们会在后续的文章中详细讨论。
插件

                    
             

因为缓存机制东西太多,因此将缓存机制的叙述拆成一下几部分(读者可点击查看):

1. MyBatis的一级缓存实现详解 及使用注意事项

2. MyBatis的二级缓存的设计原理

3. 自定义二级缓存(未完,待续)

4. 使用第三方内存库做为MyBatis的二级缓存(未完,待续)





做者的话

    本文是《深刻理解mybatis原理》系列的其中一篇,若是您有兴趣,请关注该系列的其余文章~

   以为本文不错,顺手点个赞哦~~您的鼓励,是我继续分享知识的强大动力!

   若是您以为有不妥或者错误的地方,还请您不吝指教!

 



 

-----------------------------------------------------------------------------------------------------------------------------------------

                                                                本文源自  http://blog.csdn.net/luanlouis/,如需转载,请注明出处,谢谢!