(基于mybatis-standalone 工程,注意演示一级缓存需要先关闭二级缓存,localCacheScope 设置为SESSION)

判断是否命中缓存:如果再次发送SQL 到数据库执行,说明没有命中缓存;如果直接打印对象,说明是从内存缓存中取到了结果。

1、在同一个session 中共享

BlogMapper mapper = session.getMapper(BlogMapper.class);
System.out.println(mapper.selectBlog(1));
System.out.println(mapper.selectBlog(1));

2、不同session 不能共享

SqlSession session1 = sqlSessionFactory.openSession();
BlogMapper mapper1 = session1.getMapper(BlogMapper.class);
System.out.println(mapper.selectBlog(1));

PS:一级缓存在BaseExecutor 的query()——queryFromDatabase()中存入。在queryFromDatabase()之前会get()。

3、同一个会话中,update(包括delete)会导致一级缓存被清空

mapper.updateByPrimaryKey(blog);
session.commit();
System.out.println(mapper.selectBlogById(1));

一级缓存是在BaseExecutor 中的update()方法中调用clearLocalCache()清空的(无条件),query 中会判断。

如果跨会话,会出现什么问题?

4、其他会话更新了数据,导致读取到脏数据(一级缓存不能跨会话共享)

// 会话2 更新了数据,会话2 的一级缓存更新
BlogMapper mapper2 = session2.getMapper(BlogMapper.class);
mapper2.updateByPrimaryKey(blog);
session2.commit();
// 会话1 读取到脏数据,因为一级缓存不能跨会话共享
System.out.println(mapper1.selectBlog(1));

MyBatis 缓存详解-一级缓存验证相关推荐

  1. MyBatis 缓存详解-一级缓存(本地缓存)介绍

    一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的.MyBatis 的一级缓存是默认开启的,不需要任何的配置. 首先我们必须去弄清楚一个问题,在MyBati ...

  2. MyBatis 缓存详解-一级缓存的不足

    使用一级缓存的时候,因为缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存.在有多个会话或者分布式环境下,会存在脏数据的问题.如果要解决这个问题,就要用到二级缓存. [思考]一级缓存怎 ...

  3. Mybatis 详解--- 一级缓存、二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...

  4. mybatis 详解------ 一级缓存、二级缓存(九)

    mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...

  5. MyBatis 缓存详解-二级缓存介绍

    二级缓存是用来解决一级缓存不能跨会话共享的问题的,范围是namespace 级别的,可以被多个SqlSession 共享(只要是同一个接口里面的相同方法,都可以共享),生命周期和应用同步. 思考一个问 ...

  6. MyBatis 缓存详解-cache 缓存

    (基于mybatis-standalone 工程) 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernate 一样,MyBatis 也有一级缓存和二级缓存 ...

  7. MyBatis 缓存详解-第三方缓存做二级缓存

    除了MyBatis 自带的二级缓存之外,我们也可以通过实现Cache 接口来自定义二级缓存. MyBatis 官方提供了一些第三方缓存集成方式,比如ehcache 和redis: https://gi ...

  8. MyBatis 缓存详解-二级缓存验证

    (验证二级缓存需要先开启二级缓存) 1.事务不提交,二级缓存不存在 BlogMapper mapper1 = session1.getMapper(BlogMapper.class); System. ...

  9. http缓存详解(强缓存、协商缓存相关字段以及缓存流程解析)

    缓存相关字段: http1.0:pragma.expires http1.1:cache-control.last-modified.if-modified-since.etag.if-none-ma ...

最新文章

  1. 关于 ES6 的 let ,var和 const
  2. 电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...
  3. 创建第一个WCF程序
  4. STM32-----找个搬砖的搬数据
  5. insert 数组_Java数组和集合的效率问题
  6. spring-boot整合场景实例分析
  7. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_17-页面静态化-模板管理-GridFS研究-存文件...
  8. 关于nagios 邮件报警问题
  9. 第五十一篇 仿真电路简单说明multisim12 电压表电流表
  10. 中国电信路由器设置虚拟服务器,中国电信天翼宽带无线路由器设置方法
  11. 使用激活工具后主页被篡改为hao123
  12. edge同步chrome书签_如何通过 iCloud 同步 chromium edge 的书签?
  13. asp.net mvc 学习总结
  14. 星球大战7:原力觉醒[Star Wars Episode VII:The Force Awakens]
  15. 运动生理学:同骨骼肌相比,心肌细胞的收缩特点是什么?
  16. 诺丁汉大学计算机专业介绍,诺丁汉大学计算机科学本科专业.pdf
  17. gihub上传本地项目简单步骤
  18. tkMapper 简记
  19. 利用Docker创建镜像运行jar包
  20. Android Paging3的使用

热门文章

  1. 程序员修炼之道:从小工到专家读后感02
  2. 在IDEA下导入Maven项目之后 Dependencies报红线
  3. 第三方支付账务系统设计难点 16
  4. 九阴真经 第十五层--node.js 第1天
  5. 系统调用syscall---用户态切换到内核态的唯一途径
  6. Azure VNet介绍
  7. spring-cloud 学习三 服务提供者
  8. 兼容ie浏览器的placeholder的几种方法
  9. 高考成绩查询接口(转)
  10. 对jquery的conflict方法的解读