一、含义:

缓存就是内存中的数据,常常来自对数据库查询结果的保存。
使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度。

Mybatis的缓存分为一级缓存、二级缓存、三级缓存。

一级缓存:
作用域是同一个 SqlSession,在同一个 sqlSession 中两次执行相同的 sql 语句,
第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取,从而提高查询效率。当一个 sqlSession 结束后该 sqlSession 中的 一级缓存也就不存在了。Mybatis 默认开启一级缓存。
一级缓存内部存储使用一个 HashMap,key 为 hashCode+sqlId+Sql 语句。value 为 从查询出来映射生成的 java 对象 sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区域。

二级缓存:
是多个 SqlSession 共享的,其作用域是 mapper 的同一个 namespace,不同 的 sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同即最终执行 相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从 缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis 默认没有开启二级缓存 需要在 setting 全局参数中配置开启二级缓存。
开启二级缓存:
1.在yml中添加以下代码

2.然后在对应的mapper.xml里面加入配置

注意:开启二级缓存后,对应的pojo一定要实现Serializable,否则在序列化的时候会报错
readOnly:是否只读 。 值为true时,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。mybatis为了加快获取速度,直接会将数据在缓存中的引用交给用户,不安全,但速度快。
值为false时,mybatis觉得获取的数据可能会被修改,mybatis会利用序列化&反序列化的技术克隆一份新的数据给你,安全,但速度慢。

三级缓存:
Mybatis 的一级缓存与二级缓存 只适用于单体项目,在分布式服务或者微服务架构下 都会出现数据不一致问题。所以Mybatis 为我们提供了自定义缓存 我们可以集成很多三方中间件来做缓存 这里就那Redis来说一下。

二、区别

1.一级缓存的作用域是一个sqlsession内;二级缓存作用域是针对mapper进行缓存;
2.一级缓存是默认开启的;二级缓存需要手动配置
3.Mybatis 的一级缓存与二级缓存 只适用于单体项目,在分布式服务或者微服务架构下 都会出现数据不一致问题。三级缓存就是为了解决这个问题

三、小结

1.一级缓存的作用域是一个sqlsession内;二级缓存作用域是针对mapper进行缓存;
2.一级缓存是默认开启的;二级缓存需要手动配置
3.一级缓存sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区域。sqlSession.close()后一级缓存也没有了。但是销毁sqlSession后会将里面的缓存存到二级缓存中;
4.二级缓存cache中readonly属性如果为false 那么相应的pojo类必须实现Serializable接口 并且其缓存查询到的对象都是通过序列化或者反序列化克隆的,所以对象之间两两不相等
5.二级缓存的生命周期和应用同步,它是用来解决一级缓存不能跨会话共享数据的问题,范围是namespace级别的,可以被多个会话共享(只要是同一个接口的相同方法,都可以进行共享)。
6.只要没有显式地设置cacheEnabled为false,都会使用CachingExector装饰基本的执行器(SIMPLE、REUSE、BATCH)。 二级缓存总是默认开启的,但是每个Mapper的二级开关是默认关闭的。
7.二级缓存进行增删改操作也会刷新二级缓存,导致二级缓存失效

附,二级缓存的执行流程:

Mybatis缓存机制(一级缓存、二级缓存、三级缓存)相关推荐

  1. Hibernate学习——(十二)Hibernate缓存机制(一级、二级、查询)

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  2. 我的架构梦:(二)MyBatis的一级、二级、分布式缓存的应用以及源码分析

    mybatis的一级.二级.分布式缓存的应用以及源码分析 一.mybatis缓存 二.一级缓存 三.一级缓存源码分析 四.二级缓存 五.二级缓存整合redis 六.二级缓存整合redis源码分析 一. ...

  3. dropdownlist三级联动怎么实现_简单三步,轻松搞定一级、二级、三级下拉菜单

    工作中,为了录入数据方便,数据规范,我们经常采用下拉菜单来制作规范模板,今天,技巧君和大家分享一下一级.二级和三级联动下拉菜单制作方法,文末有示例文件下载方法哦! 下拉菜单示例 一级下拉菜单 一级下拉 ...

  4. 网络安全NISP证书一级、二级、三级介绍

    ​介绍 国家信息安全水平测试(NISP)是中国信息安全测评中心测试.颁证,国家实行网络空间安全人才培养基地经营管理,并授权网安世纪科技有限公司为NISP资格证书管理处. NISP验证分成一级.二级.三 ...

  5. 承装承修承试电力资质一级、二级、三级、四级、五级怎么办理?

    许可证分为承装.承修.承试三个类别. 取得承装类许可证的,可以从事电力设施的安装活动,取得承修类许可证的,可以从事电力设施的维修活动,取得承试类许可证的,可以从事电力设施的试验活动 . 承装类承装(修 ...

  6. Mybatis(五) 延迟加载和缓存机制(一级二级缓存)

    踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WZY 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表 ...

  7. 【mybatis】Mybatis中的一级、二级缓存

    [mybatis]简介 [mybatis]mybatis & mybatis-plus & hibernate的区别 [mybatis]核心成员分析 [mybatis]Mybatis的 ...

  8. 什么是Spring三级缓存 对象在三级缓存中的创建流程 【三级缓存 循环依赖】

    一.什么是Spring三级缓存 第一级缓存:也叫单例池,存放已经经历了完整生命周期的Bean对象. 第二级缓存:存放早期暴露出来的Bean对象,实例化以后,就把对象放到这个Map中.(Bean可能只经 ...

  9. android三级缓存封装,Android 中图片的三级缓存详解

    图片的三级缓存机制一般是指应用加载图片的时候,分别去访问内存,文件和网络而获取图片数据的一种行为. 一.三级缓存流程图 三级缓存流程图 二.代码框架搭建 这里我仿造Picasso[3]的加载图片代码, ...

最新文章

  1. OSChina 周二乱弹 —— 最要命的编程语言?
  2. 项目开发管理工具---GitHub(一)
  3. ARC 101 D - Median of Medians
  4. linux安装mysql出错( file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.5.31-2.el6.i6)
  5. 未来机器人哆拉A梦身上的高科技程序应用
  6. Java 中 notify 和 notifyAll 有什么区别?
  7. 高分辨率扫描出来的图片有摩尔纹_【艺术与设计】 摩尔纹的设计
  8. mac上好用的下载器有哪些,mac下载种子用什么软件
  9. 联想G460驱动问题
  10. linux,centos7环境下,安装RabbitMQ
  11. matlab哪些教材好,新手入门,恳请推荐一本matlab好教材
  12. 《IDSSIM:基于改进的疾病语义相似度方法的lncRNA功能相似度计算模型》论文梳理
  13. html5不断切换的场景,HTML5场景: 沉舟侧畔千帆过(漂浮和沉没的帆船)
  14. 解决:ActiveX控件不能使用
  15. 传奇关于首饰盒装备系统“十二生肖”“五行八卦”等脚本实例
  16. Codeforces Round #439 (Div. 2)C - The Intriguing Obsession(简单dp)
  17. html玫瑰花效果代码,HTML5 canvas绘制的玫瑰花效果
  18. 一种解决方法 Error: No such file or directory @ rb_sysopen
  19. strncmp函数的简单用法
  20. 新买了个redmi红米ax6s网速超快刷openwrt

热门文章

  1. 大数运算(高精度运算)
  2. notify()和notifyAll()有什么区别
  3. Chap.17 总结《CL: An Introduction》 (Vyvyan Evans)
  4. setTimeout()的返回值
  5. [论文素材]Previous Work----自动仇恨言论检测和冒犯性语言问题
  6. PID控制算法原理通俗讲解
  7. Mornsun B0505S-1WR3 隔离模块DC/DC
  8. 本地化、全球化、国际化测试的概念
  9. CSS精灵图代码示例
  10. python3判断字典中的key是否存在_python3判断key存在字典中的方法是什么