Mybatis学习笔记-缓存
简介
什么是缓存
**将一次查询的结果暂存至内存,后续查询只需查询缓存**
为什么使用缓存
**减少与数据库的交互次数,减少系统开销,提高系统效率**
什么样的数据能使用缓存
**经常查询且不常修改的数据**
Mybatis缓存
一级缓存
也叫本地缓存,默认开启,无法关闭,只在一次SqlSession中有效(拿到连接->关闭连接),底层由【Map】实现数据存储
- 与数据库同一次会话期间查询到的数据会放在本地缓存中
- 若之后需要获取相同数据,直接从缓存中获取
<select id="queryUserById" resultType="User">
SELECT * FROM user WHERE id = #{id};
</select>
<update id="updateUser" parameterType="User">
UPDATE user set name = #{name}, pwd = #{pwd} WHERE id = #{id};
</update>
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
User user2 = mapper.queryUserById(1);
System.out.println(user == user2);
sqlSession.close();
- 日志输出SQL语句仅执行一次,且输出结果为true,表明两个user实例对象为同一个
sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
User iris = new User(1, "Iris", "123");
mapper.updateUser(iris);
User user2 = mapper.queryUserById(1);
System.out.println(user == user2);
- 在修改数据库数据(哪怕不是目标记录)后再次查询会重新访问数据库
【缓存失效原因】
- 查询不同的记录
- 查询不同的Mapper
- 不同线程查询
- 增删改操作均可能导致缓存刷新
- 手动清除
二级缓存
需在核心配置文件中打开缓存【即使默认开启】,才能手动配置缓存属性
开启全局缓存(手动显示开启)
<setting name="cacheEnabled" value="true"/>
全局缓存,由于一级缓存作用域太低从而产生,基于namespace级别的缓存,二级缓存会将每次会话的一次缓存出保存至二级缓存,不同mapper所查询的数据放在其对应缓存【Map】中
二级缓存由标签cache实现,其中可设置相关属性:
- 缓存策略
- LRU【默认】:最近最少使用(移除最长时间不被使用的对象)
- FIFO:先进先出(按对象进入缓存的顺序来移除它们)
- SOFT:软引用(基于垃圾回收器状态和软引用规则移除对象)
- WEAK:弱引用(更积极地基于垃圾收集器状态和弱引用规则移除对象)
- 缓存刷新间隔(ms)
- 引用数目【默认为1024个对象】
- 是否仅可读【默认可读写】
下面的示例创建了一个FIFO缓存,间隔60刷新,最多存储512个对象且返回的对象仅可读
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
测试二级缓存是否有效
SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession2 = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
sqlSession.close();
User user2 = mapper2.queryUserById(1);
System.out.println(user2);
System.out.println(user == user2);
sqlSession2.close();
【结果输出:true】意为sqlSqssion2在sqlSession关闭后从二级缓存中获取到了sqlSession存入的数据。
报错【对象未序列】的解决方法
- 实例对象继承Serializable
public class User implements Serializable - 设置缓存对象仅可读(mapper.xml中)
readOnly="true"
小结
- 只要开启二级缓存,在相同Mapper下均有效
- 所有数据都会先放在一级缓存中
- 只有当会话提交/关闭,数据才转存至二级缓存中
Mybatis缓存原理

Mybatis学习笔记-缓存的更多相关文章
- Mybatis学习笔记导航
Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- mybatis学习笔记之基础框架(2)
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...
- mybatis学习笔记之学习目录(1)
mybatis学习笔记之学习结构(1) 学习结构: 1.mybatis开发方法 原始dao开发方法(程序需要编写dao接口和dao实现类) mybatis的mapper接口(相当于dao接口)代理开发 ...
- Mybatis学习笔记汇总(包括源码和jar包)
博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...
- 【MyBatis学习笔记】
[MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...
- Mybatis学习笔记(二) 之实现数据库的增删改查
开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
随机推荐
- 可扩展的 Web 架构与分布式系统
作者:Kate Matsudaira 译者:尹星 本文介绍了分布式架构是如何解决系统扩展性问题的粗略方法,适合刚刚入门分布式系统的同学,我把整篇文章翻译如下,希望给你一些启发. 备注:[idea]标注 ...
- golang中的defer和return的执行顺序
结论 go中是先给return准备返回值,再根据defer先进后出的规则执行,最后将返回值返回给调用者 测试用例1验证分析 代码片段如下: func foo_1() (err error) { def ...
- 对ES6中类class以及实例对象、原型对象、原型链之间关系的详细总结
1. 类 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后用这个类来实例化对象.即类的用途:实例化对象. // 创建一个Person类 class Person { } // ...
- 关于Android Studio Emulator常见使用问题
Q:模拟器无法初始化声音相关设备 Emulator: dsound: Could not initialize DirectSoundCapture Emulator: dsound: Reason: ...
- ABP Framework V4.4 RC 新增功能介绍
目录 新增功能概述 启动模板删除 EntityFrameworkCore.DbMigrations 项目 CMS-Kit 动态菜单管理 Razor引擎对文本模板的支持 DbContext/Entiti ...
- gitlab 设置分支保护功能及取消分支保护
使用gitlab管理员账户登录gitlab系统 进入需要分支保护的项目 进行分支保护设置 保护开发分支策略配置 保护RC送测库分支策略配置 调整分支保护策略 效果展示 取消分支保护 效果展示
- 36、网卡绑定bond
注意:虚拟机需要网卡模式为同一模式,否则无法进行通信: 36.1.mode0(平衡负载模式): 平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术. ...
- 教你几招HASH表查找的方法
摘要:根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的.地址连续的地址集 (区间) 上,并以关键字在地址集中的"象"作为相应记录在表中的存储 ...
- html的题库(含答案)
该题库仅供巩固自身HTML知识 Tip:<为< 单选题 1.下面标记中,用来显示段落的标记是( D ). A.<h1> B.<br /> C.<img / ...
- Java:java获取Linux下的路径
指定Linux的路径 //Linux系统路径 StringBuilder sb = new StringBuilder(File.separator); String Url = sb.append( ...