(验证二级缓存需要先开启二级缓存)

1、事务不提交,二级缓存不存在

BlogMapper mapper1 = session1.getMapper(BlogMapper.class);
System.out.println(mapper1.selectBlogById(1));
// 事务不提交的情况下,二级缓存不会写入
// session1.commit();
BlogMapper mapper2 = session2.getMapper(BlogMapper.class);
System.out.println(mapper2.selectBlogById(1));

思考:为什么事务不提交,二级缓存不生效?

因为二级缓存使用TransactionalCacheManager(TCM)来管理,最后又调用了TransactionalCache 的getObject()、putObject 和commit()方法,TransactionalCache里面又持有了真正的Cache 对象,比如是经过层层装饰的PerpetualCache。

在putObject 的时候,只是添加到了entriesToAddOnCommit 里面,只有它的commit()方法被调用的时候才会调用flushPendingEntries()真正写入缓存。它就是在DefaultSqlSession 调用commit()的时候被调用的。

2、使用不同的session 和mapper,验证二级缓存可以跨session 存在取消以上commit()的注释

3、在其他的session 中执行增删改操作,验证缓存会被刷新

Blog blog = new Blog();
blog.setBid(1);
blog.setName("357");
mapper3.updateByPrimaryKey(blog);
session3.commit();
// 执行了更新操作,二级缓存失效,再次发送SQL 查询
System.out.println(mapper2.selectBlogById(1));

思考:为什么增删改操作会清空缓存?

在CachingExecutor 的update()方法里面会调用flushCacheIfRequired(ms),isFlushCacheRequired 就是从标签里面渠道的flushCache 的值。而增删改操作的flushCache 属性默认为true。

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

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

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

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

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

  3. MyBatis 缓存详解-一级缓存验证

    (基于mybatis-standalone 工程,注意演示一级缓存需要先关闭二级缓存,localCacheScope 设置为SESSION) 判断是否命中缓存:如果再次发送SQL 到数据库执行,说明没 ...

  4. MyBatis 缓存详解-cache 缓存

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

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

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

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

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

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

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

  8. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  9. Mybatis二级缓存详解

    Mybatis二级缓存 Mybatis相关全览 一.简介 二.一级缓存 1.入口 2.演示 案例一: 案例二: 3.总结 三.二级缓存 1.入口 2.如何开启二级缓存 cache-ref配置 cach ...

最新文章

  1. Webpack 代码分离
  2. python代码计算图像的分辨率
  3. 一个管理者的反思(太深刻了!)
  4. 选哪扇门得奖金的算法
  5. .net 连接php,NetBeans平台如何连接到PHP解析器?
  6. 洛谷 - P3254 圆桌问题(最大流+路径打印)
  7. 两分钟倒计时(Python)
  8. js中 switch 注意事项
  9. 有道词典Linux版下载安装
  10. eslint 报error
  11. PHP - ReflectorClass 反射类的作用
  12. linux硬盘分区PPT,linux下的硬盘分区详解.doc
  13. 拓端tecdat|通过Python中的Apriori算法进行关联规则挖掘
  14. Python开发过程中错误解决记录【持续更新记录,欢迎交流】
  15. linux酷q运行不了,笔记:Linux中安装酷Q
  16. 高分屏更改Adobe Premier CC UI界面字体大小
  17. plsql导出oracle数据库表结构及表数据
  18. css 文本和div垂直居中方法汇总
  19. 永久免费的域名注册有吗?免费的域名注册在哪个平台?
  20. TF flags的简介

热门文章

  1. 女生适不适学习Java编程
  2. kong安装配置手册
  3. UOJ #585. 新年和多米诺
  4. div赋值,取值和input赋值,取值
  5. RTMP流媒体播放过程:握手,建立连接,建立流,播放
  6. 读书笔记5-处理器的微架构
  7. Spring注解方式实现定时器
  8. 莫比乌斯反演定理证明
  9. noip模拟赛 abcd
  10. idea传入HttpServletRequest时显示cannot resolve symbol的问题