MyBatis缓存

  • 什么是MyBatis缓存:

    Mybatis中有一级缓存和二级缓存。一级缓存又被称为本地缓存,是Session会话级别的,一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下一级缓存是开启的,而且是不能关闭的。二级缓存是针对mapper进行的缓存,它的生命周期很长,跟Application的生命周期一样,也就是说它的作用范围是整个Application应用

  • 一级缓存的原理:

    • 未开启二级缓存时图解:

    • 工作机制:

      一般而言,一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能。

    • 步骤:

    1. 第一次发出一个查询的 sql 语句,查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map
    • key:MapperID + offset + limit + Sql + 传入的参数

    • value:用户信息

    1. 同一个sqlsession再次发出相同的 sql 语句,就从缓存中取出数据

    2. 如果两次中间出现commit 操作(修改、添加、删除),close(),clearCache()等方法时,这次sqlsession中的一级缓存区域全部清空,下次再去缓存中查询不到,所以要从数据库查询,从数据库查询到再写入缓存

  • 二级缓存原理:

    • 如何开启二级缓存?

      SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口

      1. Mybatis全局配置中启用二级缓存配置
      2. 在对应的 Mapper.xml 中配置cache节点
      3. 在对应的select查询节点中添加useCache=true
    • 开启二级缓存时图解:

    • 工作机制:

      在一级缓存中,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。

    • 注意:需要关闭一级缓存,即调用SqlSession的close()方法后,才能从二级缓存中查数据

    • 步骤:

    1. 二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map
    2. mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor 其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。
  • 第三方缓存库

    • MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis默认实现的二级缓存;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库,如MemCached、OSCache、EHCache等

面试题之MyBatis缓存相关推荐

  1. if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...

    前言 这是 mybatis 比较常问到的面试题,我自己在以前的面试过程中被问到了2次,2次都是非常重要的面试环节,因此自己印象很深刻. 这个题目我很早就深入学习了,但是一直没有整理出来,刚好最近一段时 ...

  2. 五分钟,带你彻底掌握 MyBatis缓存 工作原理

    作者:双子孤狼 blog.csdn.net/zwx900102/article/details/108696005 前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的 ...

  3. MyBatis复习笔记6:MyBatis缓存机制

    MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...

  4. 实际测试例子+源码分析的方式解剖MyBatis缓存的概念

    前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...

  5. Mybatis 缓存系统源码解析

    Mybatis 缓存系统源码解析 转载于:https://juejin.im/post/5bfa50905188251d0920006c

  6. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  7. MyBatis(三)MyBatis缓存和工作原理

    MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...

  8. 后端:MyBatis缓存知识介绍

    今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助! 一.MyBatis一级缓存 1.一级缓存介绍 当我们的程序MyBatis开启一次和数据库的会话,MyBatis会自动 ...

  9. MyBatis缓存通俗易懂

    1.1     mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的 ...

  10. 缓存在哪里_什么是MyBatis缓存技术

    MyBatis缓存 引言 在一个Web项目中,查询数据库中的操作算是一个非常常用的操作,但是有些数据会被经常性的查询,而每一次都去数据库中查询这些重复的数据,会很消耗数据库的资源,同时使得查询效率也很 ...

最新文章

  1. linux代码动态分析软件,举例分析Linux动态库和静态库
  2. 汇编和python-编程语言与Python介绍
  3. c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
  4. 折腾 | pytoch、cuda版本问题
  5. 网络编程套接字(一)
  6. torch tensor去掉1维_南昌清污机新价格表1_海腾水工
  7. 阿里云移动端播放器高级功能---截图和音频波形 1
  8. 封装和参数调用(格式修改)
  9. Ubuntu系统安装字体方法
  10. 《大数据技术原理与应用》 期末复习
  11. 计算机教学提问的观课量表,观课议课|如何使用观察和记录量表
  12. python flag=1_python中flag什么意思
  13. [hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题
  14. 开源图像数据集管理工具fiftyone使用
  15. 安徽师大附中%你赛day3T1 怜香惜玉 解题报告
  16. Linux挂载Windows共享文件夹
  17. 主成分分析(PCA)与矩阵奇异值分解(SVD)
  18. 约束优化求解之罚函数法
  19. 微信群怎么没有群管理员这项
  20. g4600黑苹果efi_【玩机教程】最全黑苹果安装教程 之 小白也能掌握(完结篇)

热门文章

  1. php生成流水号,生成唯一流水号
  2. 医疗AI的dicom图像拉取模块设计
  3. 一文搞懂CAN总线协议帧格式
  4. 四象限原则+番茄时间管理法
  5. 核心单词Word List 2
  6. Linux网络的网络配置(超详细,百分百成功)
  7. 免费在线的数据库建模工具,云版PownerDesigner
  8. Sobel边缘检测算子数学原理再学习
  9. c语言日程报告闹钟,可以闹钟提醒的日程表,日程闹钟提醒怎么弄
  10. 新推多多旅行搅局在线旅游市场,拼多多有多少胜算?