MyBatis一级缓存的笔记及记录
精髓内容来源于《图灵学院》
- 一、概述:
一级缓存是MyBatis天然自带的,是默认开启且没有关闭的地方,1级缓存只能作用于查询回话中,所以也叫会话缓存;
这里举个例子:
订单表存在一对多的关系,为了尽可能的减少join的查询,进行了分阶段查询; 先查询出订单表,在根据订单的用户ID查询用户信息表,最后将数据进行整合。如果订单表中存在重复的用户ID,就会出现很多没有必要的重复查询。 1级缓存解决了这个问题(1个语句被执行多次,也就是大家说的“N+1”的问题),在同一次查询回话中如果出现相同的语句及参数,就会从缓存中取出,不会直接从数据库端拉取数据。
- 二、使用条件及限制:
一级缓存又称为本地缓存,大致限制如下:
- 必须是相同的SQL和参数;
- 必须是同一个会话;
- 必须是相同的Mapper;
- 必须是相同的接口及方法;
- 查询前不能执行session.clearCache();
- 查询语句中间不能出现增删改的原子操作,因为“增删改”操作后会自动调用session.clearCache();这里需要注意,是否更新1级缓存是取决于你的注解或者XML原标签,也就是说如果@Update("select * from test where id=#{id}")也会清空1级缓存;
- 三、实现原理:
实现了Cache接口——PerpetualCache类,cache变量就是一个简单的HashMap,所以一级缓存就是通过HashMap实现的;
这里需要特别注意一下:
因为是基于HashMap实现,在查询时另一个会话并发去修改查询的数据的时候,一级缓存会有效,也就是非线程安全,存在并发问题,但是一级缓存又是属于本地缓存而且基于当前会话,所以这个并发问题可以忽略,您难道在自己的代码里还要实现内部并发吗?:);
- 四、缓存调用逻辑:
- 调用mapper的执行方法(这里的mapper对象是通过Java代理实现的);
- DefaultSqlSession.selectList方法开始进行处理,所有查询都会进入这里;
- CachingExecutor.query:缓存执行器开始执行获取数据处理;
- BaseExecutor.query:查询缓存信息。这里注意一下,clearLocalCache方法是清空缓存调用的方法,(如果当前没有关闭,就执行清空操作,这里清空是全部清空);
- PerpetualCache.getObject:获取缓存;
后续可能持续更新
MyBatis一级缓存的笔记及记录的更多相关文章
- MyBatis二级缓存的笔记及记录
一.什么是二级缓存: 由于一级缓存是一次性的.临时的:每个会话都会创建一个新的:多个会话之间是不能共享的: 二级缓存用于解决一级缓存的不足:每一个“namespace”都会对应一个二级缓存:执行查询的 ...
- 0065 MyBatis一级缓存与二级缓存
数据库中数据虽多,但访问频率却不同,有的数据1s内就会有多次访问,而有些数据几天都没人查询,这时候就可以将访问频率高的数据放到缓存中,就不用去数据库里取了,提高了效率还节约了数据库资源 MyBatis ...
- Mybatis一级缓存和二级缓存 Redis缓存
一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对 ...
- Mybatis一级缓存的锅
问题背景 项目开发中有一个树形数据结构,不像经典组织结构树.菜单级别树,我们这个树形结构是用户后期手动建立起来的关系.因此数据库表结构为两张表:数据记录表.记录关系表,通过业务规则限制,形成的树形结构 ...
- MyBatis 一级缓存与二级缓存
MyBatis一级缓存 MyBatis一级缓存默认开启,一级缓存为Session级别的缓存,在执行以下操作时一级缓存会清空 1.执行session.clearCache(); 2.执行CUD操作 3. ...
- MyBatis一级缓存引起的无穷递归
MyBatis一级缓存引起的无穷递归 引言: 最近在项目中参与了一个领取优惠劵的活动,当多个用户领取同一张优惠劵的时候,使用了数据库锁控制并发,起初的设想是:如果多个人同时领一张劵,第一个到达的人领取 ...
- mybatis一级缓存详解
mybatis缓存分为一级缓存,二级缓存和自定义缓存.本文重点讲解一级缓存 一:前言 在介绍缓存之前,先了解下mybatis的几个核心概念: * SqlSession:代表和数据库的一次会话,向用户提 ...
- MyBatis 一级缓存避坑
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选: package org.apache.ibatis.session; /** * @autho ...
- 关于mybatis 一级缓存引发的问题
场景: 由于在一个方法中存在多个不同业务操作 private void insertOrUpdateField(CompanyReport entity) { //计算并数据 calcReportDa ...
随机推荐
- 2、DockPanel
DockPanel——停靠面板,内部控件或容器可以放置在上.下.左(默认).右.类似于Java AWT布局中的BorderLayout. 但与BorderLayout不同的是,每一个区域可以同时放置多 ...
- jquery text选择器 语法
jquery text选择器 语法 作用::text 选择器选取类型为 text 的 <input> 元素.大理石平台检定规程 语法:$(":text") jquery ...
- POJ 1087 最大流裸题 + map
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15597 Accepted: 5308 ...
- reactjs 的 css 模块化工具 styled-components 升级后 createGlobalStyle 废除,使用 createGlobalStyle 的方案
在 styled-components 升级到 4 版本后设置全局属性的 createGlobalStyle 这个 api 被废除,替代的 api 是 createGlobalStyle 与过去组织代 ...
- R_Studio(学生成绩)对数据缺失值md.pattern()、异常值分析(箱线图)
我们发现这张Gary.csv表格存在学生成绩不完全的(五十三名学生,三名学生存在成绩不完整.共四个不完整成绩) 79号大学语文.高等数学 96号中国近代史纲要 65号大学体育 (1)NA表示数据集中的 ...
- Java中 intValue,parseInt,Valueof 这三个关键字的区别
intValue()是把Integer对象类型变成int的基础数据类型: parseInt()是把String 变成int的基础数据类型: Valueof()是把给定的String参数转化成Integ ...
- DeepFaceLab: 可视化交互式合成功能简介!
DeepFaceLab在沉寂了几个月后(目测Iperov同志讨生活去了),在8月下旬又迎来了重大更新.我总结了一下,主要是更新了三大功能. 新增Avatar模型 交互式转换器 半脸模型支持FAN ...
- java 深入HashMap
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- 引用&指针交换函数实践
实践如下: #include <iostream> using namespace std; // 普通交换,注意这里的ab值,在具体调用时是基本数据的拷贝,原始数据不会变化 // 因此这 ...
- CocoaPods 安装及使用(亲测有效)
一.What is CocoaPods? CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It ...