MyBatis查询缓存
七、查询缓存
1. 什么是查询缓存
- MyBatis提供查询缓存,用于减轻数据库压力,提高数据库性能
- MyBatis提供一级缓存,和二级缓存
- 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的SqlSession之间的缓存数据区域(HashMap)是互相不影响的
- 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的
2. 一级缓存
2.1 一级缓存工作原理
- 第一次查询id为1的数据,先去找一级缓存中查找是否有id为1的数据,如果没有,从数据库中查询该数据,并将该数据存储到一级缓存中
- 第二次查询id为1的数据,也先去找一级缓存中查找是否有id为1的数据,缓存中有,直接从缓存中获取该数据,不再查询数据库
- 如果SqlSession去执行commit操作(执行插入、更新、删除),将清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的数据,避免脏读
2.2 一级缓存测试
SqlSession session = MybatisUtil.openSession();
PersonMapper mapper = session.getMapper(PersonMapper.class);
System.out.println("第一次查询id为1的数据");
Person p1 = mapper.findPersonById(1);
System.out.println(p1);//执行commit()方法,会清空一级缓存
session.commit();System.out.println("第二次查询id为1的数据");
Person p2 = mapper.findPersonById(1);
System.out.println(p2);
session.close();
3. 二级缓存
3.1 二级缓存工作原理
- SqlSession1去查询id为1的数据,查询到后会将该数据存储到二级缓存中
- SqlSession2去查询id为1的数据,去缓存中找是否存在数据,如果存在直接从缓存中取出数据
- 如果SqlSession3去执行相同mapper下sql,执行commit提交,清空该mapper下的二级缓存区域的数据
- 二级缓存与一级缓存区别,二级缓存的范围更大,多个SqlSession可以共享一个Mapper的二级缓存区域
- 每个mapper有一个二级缓存区域,按namespace分
- 如果两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中
3.2 开启二级缓存
在mybatis核心配置文件中配置:cacheEnabled
设置项 | 描述 | 允许值 | 默认值 |
---|---|---|---|
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置 | true \ false | true |
<!-- 全局参数设置 -->
<settings><!-- 开启二级缓存--><setting name="cacheEnabled" value="true"/>
</settings>
在映射文件中开启二缓存,Mapper.xml下的Sql执行完成会存储到它的缓存区域(HashMap)
<mapper namespace="com.mybatis.mapper.PersonMapper"><!-- 配置当前mapper文件中所有查询语句都放入二级缓存中 --><cache/><select>...</select>
</mapper>
3.3 实体类
二级缓存中存储数据的实体类必须实现可序列化接口(java.io.Serializable)
public class Person implements Serializable {private Integer id;private String name;private Integer age;private String address;//get,set方法省略...
}
3.4 二级缓存测试
SqlSession session1 = MybatisUtil.openSession();
PersonMapper mapper1 = session1.getMapper(PersonMapper.class);
System.out.println("第一次查询id为1的数据");
Person p1 = mapper1.findPersonById(1);
System.out.println(p1);
session1.close();SqlSession session2 = MybatisUtil.openSession();
PersonMapper mapper2 = session2.getMapper(PersonMapper.class);
System.out.println("第二次查询id为1的数据");
Person p2 = mapper2.findPersonById(1);
System.out.println(p2);
session2.close();
3.5 useCache配置
在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询。默认情况是true,即该sql使用二级缓存
<!-- useCache="false"禁用当前sql语句的二级缓存 -->
<select id="findPerson" resultType="Person" useCache="false">select id,name,age,address from person order by id
</select>
MyBatis查询缓存相关推荐
- Spring Boot之基于Redis实现MyBatis查询缓存解决方案
转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...
- mybatis查询缓存——(十三)
1. mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. ...
- java ssm框架 缓存_SSM框架之MyBatis3专题4:查询缓存
查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库中查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(声明周期)可 ...
- MyBatis_查询缓存01
一.查询缓存 查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简单化,不在每次均从数据库中查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用 ...
- java元婴期(25)----java进阶(mybatis(4)---高级映射查询缓存)
1.需要用到的数据模型(这是后面高级查询需要用到的实例) 用户表user: 记录了购买商品的用户信息 订单表:orders 记录了用户所创建的订单(购买商品的订单) ...
- mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)
查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...
- mybatis中的查询缓存
转载自:https://www.cnblogs.com/zhangzongle/p/6211285.html 查询缓存 Mybatis提供查询缓存,用于减轻数据压力,提高数据库压力. Mybatis提 ...
- 查询缓存---Mybatis学习笔记(十)
mybatis缓存介绍 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSessio ...
- MyBatis之查询缓存
MyBatis之查询缓存 2017/09/30 正如大多数持久层框架一样,MyBatis同样也提供了对查询数据的缓存支持.今后我们要学习的SpringMVC框架属于系统控制层,它也有它的缓存区域,对响 ...
最新文章
- mysql innodb引擎丢失_【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据...
- 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络
- matlab 电磁兼容仿真软件,EMC Studio免费版
- CoreSight介绍篇
- laravel Collection mapToDictionary 例子
- bigquery数据类型_将BigQuery与TB数据一起使用后的成本和性能课程
- html图片多边形怎么写,使用CSS3构建的图像多边形裁剪动画特效
- byte数组添加数据_C#基于S7协议实现对PLC中DB块字节数据的获取及自定义textbox实现数据解析...
- hid在linux上的轮训时间,linux 自定义hid速度优化
- frame框架左右展开收缩(上下左右,其中左右可收缩)
- git jenkins 子目录_在Jenkins中,如何将项目签出到特定目录(使用GIT)
- python基础篇 —— 类
- Field _II 仿真 学习笔记
- flex-builder编译方法
- 【王佩丰】PowerPoint2010视频教程 1
- 苹果Mac更新系统版本失败如何解决?
- docker 查看容器日志命令
- 【RFID】阅读器和应答器之间的电感耦合
- 我们分析了 10000 条视频,终于知道了今日头条推荐系统的秘密
- win7怎么进入安全模式_win7进入安全模式教程