mybatis的一级缓存和二级缓存
一、什么是缓存
缓存是存在于内存中的临时数据。
使用缓存减少和数据库的交互次数,提高执行效率。
1、适用于缓存
- 经常查询并且不经常改变的;
- 数据的正确与否对最终结果影响不大的;
2、不适用于缓存
- 经常改变的数据;
- 数据的正确与否对最终结果影响很大的;
- 例如:商品的库存,银行的汇率,股市的牌价;
二、mybatis一级缓存
1、一级缓存简介
一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。
一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,默认打开一级缓存。
2、何时清空一级缓存
如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。
3、一级缓存无过期时间,只有生命周期
MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个Executor对象,Executor对象中持有一个PerpetualCache对象,见下面代码。当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
三、mybatis二级缓存
1、二级缓存简介
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
2、二级缓存何时存入
在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。
开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中。
3、二级缓存有过期时间,但没有后台线程进行检测
需要注意的是,并不是key-value的过期时间,而是这个cache的过期时间,是flushInterval,意味着整个清空缓存cache,所以不需要后台线程去定时检测。
每当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。
4、当 Mybatis 调用 Dao 层查询数据库时,先查询二级缓存,二级缓存中无对应数据,再去查询一级缓存,一级缓存中也没有,最后去数据库查找。
往期精彩内容:
Java知识体系总结
Spring框架总结
超详细的springBoot学习笔记
常见数据结构与算法整理总结
Java设计模式:23种设计模式全面解析
Java面试题总结(附答案)
Linux知识体系总结
Redis知识体系总结
mybatis的一级缓存和二级缓存相关推荐
- Mybatis一级缓存,二级缓存的实现就是这么简单
介绍 又到了一年面试季,所以打算写一点面试常问的东西,争取说的通俗易懂.面试高级岗,如果你说熟悉Mybatis,下面这些问题基本上都会问 Mybatis插件的实现原理? 如何写一个分页插件? Myba ...
- mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存
设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --><settings& ...
- MyBatis框架:延迟加载策策略、一级缓存、二级缓存
MyBatis框架:延迟加载策略和缓存 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用association实现延迟加载 1.3.1 账户的持久层DAO接口 1. ...
- 浅谈Mybatis的一级缓存和二级缓存
MyBatis的缓存机制 缓存的引入 当我们大量执行重复的查询SQL语句的时候,会频繁的和数据库进行通信,会增加查询时间等影响用户体验的问题,可以通过缓存,以降低网络流量,使网站加载速度更快. MyB ...
- MyBatis】MyBatis一级缓存和二级缓存
转载自 MyBatis]MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存.一级缓存的作用域默认是一个SqlSe ...
- Mybatis 详解--- 一级缓存、二级缓存
2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...
- Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
文章目录 一级缓存 二级缓存 总结 对于一名程序员,缓存真的很重要,而且缓存真的是老生常谈的一个话题拉.因为它在我们的开发过程中真的是无处不在.今天LZ带大家来看一下.Mybatis是怎么实现一级缓存 ...
- 框架源码专题:Mybatis的一级缓存、二级缓存是什么?有什么作用?
文章目录 1. Mybatis中缓存的作用 2. 一级缓存 3. 二级缓存 4. 一级缓存和二级缓存的区别 5. 通过代码观察Mybatis缓存工作的全过程 1. Mybatis中缓存的作用 首先缓存 ...
- MyBatis中的一级缓存和二级缓存介绍
先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级 ...
- mybatis 详解------ 一级缓存、二级缓存(九)
mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...
最新文章
- 「数据科学家」必备的10种机器学习算法
- golang runes 字符串 互转
- struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别
- php 单例类 mysql pdo_PHP实战:PHP基于单例模式编写PDO类的方法
- 【OpenGL从入门到精通(七)】OpenGL中的数学
- 【Java学习笔记六】常用数据对象之String
- php fatal error 500,PHP在Linux下出现HTTP ERROR 500解决方法
- 自动驾驶:蛇形曲线跟踪(Stanley Model)
- hosts多个ip对应一个主机名_Ubuntu16.04修改主机名和查看主机名的方法
- 算法提高 求最大值java_算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
- 【排序算法】归并排序-递归方法
- nginx 子进程 woker process 启动失败的问题
- Java程序员须知的七个日志管理工具(转)
- 机器人J中WPR_中国工业机器人的产业链及发展现状分析
- DCDC电源芯片的引脚功能及应用-BUCK芯片和BOOST芯片
- 推荐几款免费的MacOS/MacBook pro/MacBook air读取NTFS格式磁盘软件(完全免费)
- Eclipse设置护眼(绿豆沙)颜色
- DSPE-PEG-MAL,474922-22-0,DSPE-PEG-Maleimide
- EDR“数据黑匣子”撬动数百亿市场,众多产业链大咖玩家已热身入场
- 【爸耕田去】专辑的原唱