精髓内容来源于《图灵学院》

  • 一、概述:

  一级缓存是MyBatis天然自带的,是默认开启且没有关闭的地方,1级缓存只能作用于查询回话中,所以也叫会话缓存;

这里举个例子:

  订单表存在一对多的关系,为了尽可能的减少join的查询,进行了分阶段查询; 先查询出订单表,在根据订单的用户ID查询用户信息表,最后将数据进行整合。如果订单表中存在重复的用户ID,就会出现很多没有必要的重复查询。 1级缓存解决了这个问题(1个语句被执行多次,也就是大家说的“N+1”的问题),在同一次查询回话中如果出现相同的语句及参数,就会从缓存中取出,不会直接从数据库端拉取数据。

  • 二、使用条件及限制:

一级缓存又称为本地缓存,大致限制如下:

  1. 必须是相同的SQL和参数;
  2. 必须是同一个会话;
  3. 必须是相同的Mapper;
  4. 必须是相同的接口及方法;
  5. 查询前不能执行session.clearCache();
  6. 查询语句中间不能出现增删改的原子操作,因为“增删改”操作后会自动调用session.clearCache();这里需要注意,是否更新1级缓存是取决于你的注解或者XML原标签,也就是说如果@Update("select * from test where id=#{id}")也会清空1级缓存;
  • 三、实现原理:

  实现了Cache接口——PerpetualCache类,cache变量就是一个简单的HashMap,所以一级缓存就是通过HashMap实现的;

这里需要特别注意一下:

  因为是基于HashMap实现,在查询时另一个会话并发去修改查询的数据的时候,一级缓存会有效,也就是非线程安全,存在并发问题,但是一级缓存又是属于本地缓存而且基于当前会话,所以这个并发问题可以忽略,您难道在自己的代码里还要实现内部并发吗?:);

  • 四、缓存调用逻辑:
  1. 调用mapper的执行方法(这里的mapper对象是通过Java代理实现的);
  2. DefaultSqlSession.selectList方法开始进行处理,所有查询都会进入这里;
  3. CachingExecutor.query:缓存执行器开始执行获取数据处理;
  4. BaseExecutor.query:查询缓存信息。这里注意一下,clearLocalCache方法是清空缓存调用的方法,(如果当前没有关闭,就执行清空操作,这里清空是全部清空);
  5. PerpetualCache.getObject:获取缓存;

后续可能持续更新

最新文章

  1. jquery 图片轮播demo实现
  2. Windows 通用应用尝试开发 “51单片机汇编”总结
  3. EntityFramework SQLite
  4. System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件
  5. java读取word内容
  6. 将n行3列的数据dataTable装换成m行7列的dataTable
  7. [ActionScript 3.0] AS3 实现XML转换成JSON
  8. crtbegin_dynamic.o: No such file: No such file or directory
  9. 修复南尼U盘
  10. NULL和nullptr的区别
  11. Android学习笔记(十七)——使用意图调用内置应用程序
  12. HTML5学习笔记四:html5结构
  13. Metasploit学习记录---Nessus安装部署
  14. 更强大的python正则表达式模块 -- regex
  15. 12、Redis的事务
  16. 【原】使用Maven完成自动化打包并部署到Linux服务器下(Tomcat7)
  17. Spring Boot学习笔记(六)mybatis配置多数据源
  18. python_cookies
  19. Luogu3387 缩点 【tarjan】【DP】
  20. UNITY UI字体模糊的原因

热门文章

  1. 关于session、cookie、sessionStorage、localStorage的简要理解
  2. UOJ #460. 新年的拯救计划 神仙题+构造
  3. fiddler(三)、会话框添加显示请求方法栏
  4. JSP中EL表达式不能使用的问题
  5. 3.1 JAVA集合框架以及区别
  6. WebView内置方案主要是通过重写WebChromeClient 来实现的,如下面的代码所示。
  7. 死磕java多线程
  8. LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
  9. C# NAudio 变声
  10. Linux-Ubuntu目录