MyBatis 缓存详解-一级缓存验证
(基于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 缓存详解-一级缓存验证相关推荐
- MyBatis 缓存详解-一级缓存(本地缓存)介绍
一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的.MyBatis 的一级缓存是默认开启的,不需要任何的配置. 首先我们必须去弄清楚一个问题,在MyBati ...
- MyBatis 缓存详解-一级缓存的不足
使用一级缓存的时候,因为缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存.在有多个会话或者分布式环境下,会存在脏数据的问题.如果要解决这个问题,就要用到二级缓存. [思考]一级缓存怎 ...
- Mybatis 详解--- 一级缓存、二级缓存
2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...
- mybatis 详解------ 一级缓存、二级缓存(九)
mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...
- MyBatis 缓存详解-二级缓存介绍
二级缓存是用来解决一级缓存不能跨会话共享的问题的,范围是namespace 级别的,可以被多个SqlSession 共享(只要是同一个接口里面的相同方法,都可以共享),生命周期和应用同步. 思考一个问 ...
- MyBatis 缓存详解-cache 缓存
(基于mybatis-standalone 工程) 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernate 一样,MyBatis 也有一级缓存和二级缓存 ...
- MyBatis 缓存详解-第三方缓存做二级缓存
除了MyBatis 自带的二级缓存之外,我们也可以通过实现Cache 接口来自定义二级缓存. MyBatis 官方提供了一些第三方缓存集成方式,比如ehcache 和redis: https://gi ...
- MyBatis 缓存详解-二级缓存验证
(验证二级缓存需要先开启二级缓存) 1.事务不提交,二级缓存不存在 BlogMapper mapper1 = session1.getMapper(BlogMapper.class); System. ...
- http缓存详解(强缓存、协商缓存相关字段以及缓存流程解析)
缓存相关字段: http1.0:pragma.expires http1.1:cache-control.last-modified.if-modified-since.etag.if-none-ma ...
最新文章
- 关于 ES6 的 let ,var和 const
- 电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...
- 创建第一个WCF程序
- STM32-----找个搬砖的搬数据
- insert 数组_Java数组和集合的效率问题
- spring-boot整合场景实例分析
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_17-页面静态化-模板管理-GridFS研究-存文件...
- 关于nagios 邮件报警问题
- 第五十一篇 仿真电路简单说明multisim12 电压表电流表
- 中国电信路由器设置虚拟服务器,中国电信天翼宽带无线路由器设置方法
- 使用激活工具后主页被篡改为hao123
- edge同步chrome书签_如何通过 iCloud 同步 chromium edge 的书签?
- asp.net mvc 学习总结
- 星球大战7:原力觉醒[Star Wars Episode VII:The Force Awakens]
- 运动生理学:同骨骼肌相比,心肌细胞的收缩特点是什么?
- 诺丁汉大学计算机专业介绍,诺丁汉大学计算机科学本科专业.pdf
- gihub上传本地项目简单步骤
- tkMapper 简记
- 利用Docker创建镜像运行jar包
- Android Paging3的使用