面试题之MyBatis缓存
MyBatis缓存
什么是MyBatis缓存:
Mybatis中有一级缓存和二级缓存。一级缓存又被称为本地缓存,是
Session会话级别
的,一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下一级缓存是开启的,而且是不能关闭的。二级缓存是针对mapper
进行的缓存,它的生命周期很长,跟Application的生命周期一样,也就是说它的作用范围是整个Application应用。一级缓存的原理:
- 未开启二级缓存时图解:
工作机制:
一般而言,一个SqlSession对象会使用一个
Executor
对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能。步骤:
- 第一次发出一个查询的 sql 语句,查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map。
key:MapperID + offset + limit + Sql + 传入的参数
value:用户信息
同一个sqlsession再次发出相同的 sql 语句,就从缓存中取出数据。
如果两次中间出现commit 操作(修改、添加、删除),close(),clearCache()等方法时,这次sqlsession中的一级缓存区域全部清空,下次再去缓存中查询不到,所以要从数据库查询,从数据库查询到再写入缓存。
二级缓存原理:
如何开启二级缓存?
SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是
可序列化
的。 也就是要求实现Serializable接口
- Mybatis全局配置中启用二级缓存配置
- 在对应的 Mapper.xml 中配置cache节点
- 在对应的select查询节点中添加useCache=true
开启二级缓存时图解:
工作机制:
在一级缓存中,一个SqlSession对象会使用一个
Executor
对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true"
,那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor
,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。注意:需要关闭一级缓存,即调用SqlSession的close()方法后,才能从二级缓存中查数据
步骤:
- 二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map。
- mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor 其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。
第三方缓存库
- MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis默认实现的二级缓存;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库,如MemCached、OSCache、EHCache等
面试题之MyBatis缓存相关推荐
- if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...
前言 这是 mybatis 比较常问到的面试题,我自己在以前的面试过程中被问到了2次,2次都是非常重要的面试环节,因此自己印象很深刻. 这个题目我很早就深入学习了,但是一直没有整理出来,刚好最近一段时 ...
- 五分钟,带你彻底掌握 MyBatis缓存 工作原理
作者:双子孤狼 blog.csdn.net/zwx900102/article/details/108696005 前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的 ...
- MyBatis复习笔记6:MyBatis缓存机制
MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...
- 实际测试例子+源码分析的方式解剖MyBatis缓存的概念
前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...
- Mybatis 缓存系统源码解析
Mybatis 缓存系统源码解析 转载于:https://juejin.im/post/5bfa50905188251d0920006c
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis(三)MyBatis缓存和工作原理
MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...
- 后端:MyBatis缓存知识介绍
今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助! 一.MyBatis一级缓存 1.一级缓存介绍 当我们的程序MyBatis开启一次和数据库的会话,MyBatis会自动 ...
- MyBatis缓存通俗易懂
1.1 mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的 ...
- 缓存在哪里_什么是MyBatis缓存技术
MyBatis缓存 引言 在一个Web项目中,查询数据库中的操作算是一个非常常用的操作,但是有些数据会被经常性的查询,而每一次都去数据库中查询这些重复的数据,会很消耗数据库的资源,同时使得查询效率也很 ...
最新文章
- linux代码动态分析软件,举例分析Linux动态库和静态库
- 汇编和python-编程语言与Python介绍
- c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
- 折腾 | pytoch、cuda版本问题
- 网络编程套接字(一)
- torch tensor去掉1维_南昌清污机新价格表1_海腾水工
- 阿里云移动端播放器高级功能---截图和音频波形 1
- 封装和参数调用(格式修改)
- Ubuntu系统安装字体方法
- 《大数据技术原理与应用》 期末复习
- 计算机教学提问的观课量表,观课议课|如何使用观察和记录量表
- python flag=1_python中flag什么意思
- [hihoCoder太阁最新面经算法竞赛1] 穿越禁区 (DFS,并查集,计算几何) 难题
- 开源图像数据集管理工具fiftyone使用
- 安徽师大附中%你赛day3T1 怜香惜玉 解题报告
- Linux挂载Windows共享文件夹
- 主成分分析(PCA)与矩阵奇异值分解(SVD)
- 约束优化求解之罚函数法
- 微信群怎么没有群管理员这项
- g4600黑苹果efi_【玩机教程】最全黑苹果安装教程 之 小白也能掌握(完结篇)