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

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

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

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

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

 一级缓存的工作机制:

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

二级缓存的工作机制:

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

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

      
             

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

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

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

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

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

转自:http://blog.csdn.net/luanlouis/article/details/41390801

最新文章

  1. CSS3自定义滚动条样式 -webkit-scrollbar
  2. 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解
  3. HBase之创建表
  4. 自然语言处理3.3——使用Unicode进行文字处理
  5. 按列 sort 排序 Linux 如何查看当前占用CPU或内存最多的K个进程
  6. 深入了解Qt(二)之元对象系统(Meta-Object System)
  7. div+css样式表的id,class的常用命名规则
  8. C# 程序集反射
  9. Java正則表達式
  10. Windows脚本修改主机名-不重启
  11. IDEA 中使用MyBatis-generator 自动生成MyBatis代码
  12. golang 常用包安装
  13. LeetCode--409--最长回文串
  14. Sublime Text 3中SublimeLinter的使用
  15. php的哈希函数
  16. 无比迅速敏捷地开发iOS超精美控件
  17. 让UpdatePanel支持文件上传(1):开始 .
  18. mac下 mysql / nginx 问题总汇
  19. SimpleDateFormat函数语法
  20. Part3_lesson3---ARM伪指令学习

热门文章

  1. SpringMVC+Spring+Mybatis整合程序之整合
  2. Xcode的Git管理
  3. Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器
  4. 初涉2-SAT
  5. Linux基础学习-使用iSCSI服务部署网络存储
  6. linux系统产生随机数的6种方法
  7. 【REDIS】 redis-cli 命令
  8. Vuex 实际使用中的一点心得 —— 一刷新就没了
  9. 【cpu】CPU版本认识
  10. 【php】子类覆盖超类方法,在超类里调用此方法会出现何种现象