七、查询缓存

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查询缓存相关推荐

  1. Spring Boot之基于Redis实现MyBatis查询缓存解决方案

    转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...

  2. mybatis查询缓存——(十三)

    1.     mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. ...

  3. java ssm框架 缓存_SSM框架之MyBatis3专题4:查询缓存

    查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库中查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(声明周期)可 ...

  4. MyBatis_查询缓存01

    一.查询缓存 查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简单化,不在每次均从数据库中查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用 ...

  5. java元婴期(25)----java进阶(mybatis(4)---高级映射查询缓存)

    1.需要用到的数据模型(这是后面高级查询需要用到的实例) 用户表user:          记录了购买商品的用户信息 订单表:orders          记录了用户所创建的订单(购买商品的订单) ...

  6. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)

    查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...

  7. mybatis中的查询缓存

    转载自:https://www.cnblogs.com/zhangzongle/p/6211285.html 查询缓存 Mybatis提供查询缓存,用于减轻数据压力,提高数据库压力. Mybatis提 ...

  8. 查询缓存---Mybatis学习笔记(十)

    mybatis缓存介绍 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSessio ...

  9. MyBatis之查询缓存

    MyBatis之查询缓存 2017/09/30 正如大多数持久层框架一样,MyBatis同样也提供了对查询数据的缓存支持.今后我们要学习的SpringMVC框架属于系统控制层,它也有它的缓存区域,对响 ...

最新文章

  1. mysql innodb引擎丢失_【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据...
  2. 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络
  3. matlab 电磁兼容仿真软件,EMC Studio免费版
  4. CoreSight介绍篇
  5. laravel Collection mapToDictionary 例子
  6. bigquery数据类型_将BigQuery与TB数据一起使用后的成本和性能课程
  7. html图片多边形怎么写,使用CSS3构建的图像多边形裁剪动画特效
  8. byte数组添加数据_C#基于S7协议实现对PLC中DB块字节数据的获取及自定义textbox实现数据解析...
  9. hid在linux上的轮训时间,linux 自定义hid速度优化
  10. frame框架左右展开收缩(上下左右,其中左右可收缩)
  11. git jenkins 子目录_在Jenkins中,如何将项目签出到特定目录(使用GIT)
  12. python基础篇 —— 类
  13. Field _II 仿真 学习笔记
  14. flex-builder编译方法
  15. 【王佩丰】PowerPoint2010视频教程 1
  16. 苹果Mac更新系统版本失败如何解决?
  17. docker 查看容器日志命令
  18. 【RFID】阅读器和应答器之间的电感耦合
  19. 我们分析了 10000 条视频,终于知道了今日头条推荐系统的秘密
  20. win7怎么进入安全模式_win7进入安全模式教程

热门文章

  1. 牛客网 - [牛客OI周赛7-普及组]救救兔子(二分)
  2. 写一个函数判断输入的数字是否为素数 (js)
  3. 小程序---微信本地存储的方法
  4. Elasticsearch数据读写过程
  5. ES集群安全重启节点的正确方法
  6. IEEE文章免费下载方法
  7. LPspice 电路仿真软件
  8. 4个单词,谷歌返回16个SQL注入漏洞
  9. tshark命令小结
  10. 双极性(相)四线步进电机TC1508S(双通道直流马达驱动器)