mybatis缓存(一,二级别)
数据查找过程:
- 二级缓存(默认关闭) -> 一级缓存(默认开启) -> 数据库
一级缓存:
- 一级缓存是SqlSession自带的。SqlSession对象被创建,一级缓存就存在了。//是针对每一个sqlSession进行缓存。
- 如果SqlSession对象关闭或调用清理方法,会导致缓存失效。
- 缓存底层实现就是通过HashMap实现的。
- 一级缓存介质——内存
如果 执行sqlsession的DML等操作,会执行commit(提交事务),最终会清空缓存(flush)。sqlSession对象销毁,一级缓存数据不存在了。sqlSession与SqlSession之间的一级缓存互相不影响。
二级缓存:
二级缓存是针对每个mapper相同 的namespace进行缓存。每个SqlSession都会首先调用mapper下的sql语句,每个mapper缓存各自的数据(存储了查询的结果集(java对象))。
每个SqlSession都可以访问到二级缓存中的数据(二级缓存SqlSessionFactory进行管理的),sqlsession对象销毁,mapper中的二级缓存数据仍然存在。
- 二级缓存介质——内存,硬盘(内存不够走硬盘)
- 二级缓存SqlSessionFactory(多个SqlSession共享)进行管理的。
.二级缓存的原理:
- Mybatis框架提供了Cache接口,缓存组件(比如redis)实现接口。//用redis做mybatis二级缓存:首先开启全局配置开关,然后编写cache的实现类,重写方法,然后在xxxClass的mapper文件里在<cache />标签里设置type属性,指定缓存实现类
二级缓存配置:
1.打开总开关:
在核心配置文件SqlMapConfig.xml中加入
<!--注意顺序-->
<setting name="cacheEnabled" value="true"/>
2.在需要开启二级缓存的mapper.xml中加入caceh标签 <caceh/>
3.二级缓存的POJO类实现Serializable接口
二级缓存失效情况:
1.在查询select标签内设置useCache="false",强制关闭二级缓存,如果要使用,得打开
<selectid="getStuById" parameterType="Integer"resultType="Student" useCache="false">
selectstu_id stuId,stu_name stuName from tbl_student where stu_id=#{stuId}
</select>
2.在执行DML操作时刷新缓存
<updateid="updateStu"parameterType="com.atguigu.mybatis.entity.Student" flushCache="true">
updatetbl_student set stu_name=#{stuName} where stu_id=#{stuId}
</update>
这是默认设置(不启动二级缓存),通常不必修改
二级缓存使用场景:
前提:
1.对于查询多,DML少,实时性要求不高(缓存一般都用在这种场景)
2.只有单表操作的表上使用二级缓存,并且所有关于这个表的操作都得在一namespace下 //其他namespace下,包含这个表的操作,那么数据不一致。比如user表,role表,userRole表,不管userRole表的查询放到user的namespace下,还是role的namespace下,user或role的表数据变更后,都会导致userRole的查询有误差
mybatis缓存(一,二级别)的更多相关文章
- Mybatis缓存(二)
Mybatis的二级缓存 1.二级缓存的范围 1. 二级缓存是Mapper级别的缓存. 2. 二级缓存的结构也是一个HashMap. 3. 不同的SqlSession对象去操作同一个mapper ...
- 【转】MaBatis学习---源码分析MyBatis缓存原理
[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...
- Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制
前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询 ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- mybatis缓存机制
目录 mybatis缓存机制 Executor和缓存 一级缓存 小结 二级缓存 小结 mybatis缓存机制 mybatis支持一.二级缓存来提高查询效率,能够正确的使用缓存的前提是熟悉mybatis ...
- Mybatis——缓存机制
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 1.默认情况下,只有一级缓存( ...
- 分享知识-快乐自己:Mybatis缓存机制
论缓存机制: 1):mybatis 提供了缓存机制减轻数据库压力,提高数据库性能. 2):mybatis 的缓存分为两级:一级缓存.二级缓存 3):一级缓存是SqlSession级别的缓存,缓存的数据 ...
- mybatis缓存机制(转)
缓存在互联网系统中是非常重要的, 其主要作用是将数据保存到内存中, 当用户查询数据 时, 优先从缓存容器中获取数据,而不是频繁地从数据库中查询数据,从而提高查询性能.目 前流行的缓存服务器有Mongo ...
- (四)mybatis缓存、事务、插件的基本知识
mybatis缓存.事务.插件的基础 一.缓存 (一)一级缓存与二级缓存 一级缓存 为了获得更好的性能,最重要的就是一级缓存.每个session对象维持一个一级缓存,session对象创建时缓存创建, ...
随机推荐
- 全国高校绿色计算大赛 预赛第一阶段(C++)第4关:计算日期
挑战任务 我们吃的食物都有保质期,现在食品监督管理局想要制作一个能准确计算食品过期日期的小程序,需要请你来进行设计. 例如:A食品在2018年1月1日生产,保质期是20天,则它的过期日期在2018年1 ...
- mybatis知识点(已掌握)
1.${} 和 #{} 的区别? ${} 直接显示传入数据,不能防止sql注入,一般用于传数据库对象(比如表名). #{} 传入数据被当成字符串,自动加上双引号,防止sql注入. 2.有哪些Execu ...
- Sigma Function (平方数与平方数*2的约数和是奇数)
Sigma Function https://vjudge.net/contest/288520#problem/D Sigma function is an interesting function ...
- RxJS之catchError
Catches errors on the observable to be handled by returning a new observable or throwing an error. 返 ...
- nSamplesPerSec和nAvgBytesPerSec
nAvgBytesPerSec 意思是每秒多少字节,你的每个sample位深(精度/bitpersample)是16bit,就是2字节,nSamplesPerSec一秒44100个sample(441 ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- fastjson的常用方法
/** * 解析对象形式的json字符串 */ public static void test1() { String jsonStr = "{\"JACKIE_ZHANG\&qu ...
- threejs纹理
纹理 纹理用来表现物体的细节.理论上可以将物体的每个细节建模出来,但是这样时间成本和性能成本都太高,因此,将物体的一些细节用纹理来表示. 图片纹理 图片纹理直接在物体表面应用图片.可以使用Textur ...
- 长时间没有操作putty就会断开连接是怎么回事?
seconds between keepalives 设置为10就好了, 这个值有什么含义,服务器为了节省资源采取了一些措施,其中一条就是如果检测一个会话(session)几分钟或者几小时没有数据流入 ...
- 使用clear来清除localStorage保存对象的全部数据
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...