在高并发的应用中,为提高访问速度,减少数据库的访问,可以使用缓存机制.
MyBatis缓存分为一级缓存和二级缓存
Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。
Mybatis二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。
一级缓存
一级缓存区域是根据SqlSession为单位划分的。
每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。
Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象。
sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。
测试
//获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserDao dao = session.getMapper(UserDao.class); //第一次查询 User user1 = dao.findUserById(1); System.out.println(user1); //第二次查询,由于是同一个session则不再向数据发出语句直接从缓存取出 User user2 = dao.findUserById(1); System.out.println(user2); //关闭session session.close();
从控制台的SQL信息可以看出,只发送了一次SQL语句。
//获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserDao dao = session.getMapper(UserDao.class); //第一次查询 User user1 = dao.findUserById(1); System.out.println(user1); //在同一个session执行更新 User user_update = new User(); user_update.setId(1); user_update.setUsername("李奎"); dao.updateUser(user_update); session.commit(); //第二次查询,虽然是同一个session但是由于执行了更新操作session的缓存被清空,这里重新发出sql操作 User user2 = dao.findUserById(1); System.out.println(user2);
从控制台的SQL信息可以看出,发送了2次查询的SQL语句。
二级缓存
二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。
每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。
Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域
开启二级缓存
在核心配置文件mybatis-config.xml中加入:
<setting name="cacheEnabled" value="true"/>
描述 |
允许值 |
默认值 |
|
cacheEnabled |
对在此配置文件下的所有cache 进行全局性开/关设置。 |
true false |
true |
要在你的Mapper映射文件中添加一行: <cache /> ,表示此mapper开启二级缓存。
实现序列化
二级缓存需要查询结果映射的POJO对象实现java.io.Serializable接口实现序列化和反序列化操作,注意如果存在父类、成员pojo都需要实现序列化接口。
public class Orders implements Serializable
public class User implements Serializable
测试
//获取session1 SqlSession session1 = sqlSessionFactory.openSession(); UserMapper userMapper = session1.getMapper(UserMapper.class); //使用session1执行第一次查询 User user1 = userMapper.findUserById(1); System.out.println(user1); //关闭session1 session1.close(); //获取session2 SqlSession session2 = sqlSessionFactory.openSession(); UserMapper userMapper2 = session2.getMapper(UserMapper.class); //使用session2执行第二次查询,由于开启了二级缓存这里从缓存中获取数据不再向数据库发出sql User user2 = userMapper2.findUserById(1); System.out.println(user2); //关闭session2 session2.close();
存
禁用二级缓存
在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
刷新缓存
在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
设置statement配置中的flushCache="true" 属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。
如下:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">
Mybatis Cache参数
flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
如下例子:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有, 默认的是 LRU:
<!--[if !supportLists]-->1. <!--[endif]-->LRU – 最近最少使用的:移除最长时间不被使用的对象。
<!--[if !supportLists]-->2. <!--[endif]-->FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
<!--[if !supportLists]-->3. <!--[endif]-->SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
<!--[if !supportLists]-->4. <!--[endif]-->WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
相关推荐
Mybatis学习笔记(三)缓存,完整代码
【MyBatis学习笔记八】——MyBatis缓存.zip 博客地址:https://blog.csdn.net/weixin_43817709/article/details/117601742
在大学期间学习Mybatis做的笔记,共有11个word,对应每个章节,从简介到缓存机制,条理清晰,重点我自己都用彩字标注。能够有效帮助初学者快速理解和掌握Mybatis。内置完整学习pdf。
6.1 mybatis缓存介绍 59 6.2 一级缓存 60 6.2.1 原理 60 6.2.2 测试1 61 6.2.3 测试2 61 6.3 二级缓存 62 6.3.1 原理 62 6.3.2 开启二级缓存: 62 6.3.3 实现序列化 63 6.3.4 测试 63 6.3.5 禁用二级缓存 63 6.3.6 ...
在学习MyBatis时自己记的笔记,内容涉及环境搭建、操作数据库、核心配置文件、获取参数的方式、各种查询功能、以及特殊的SQL如何执行、怎么自定义ResultMap、动态SQL、MyBatis的缓存机制、逆向工程、以及分页插件等...
│ │ 第一章第1节: 13-mybatis缓存.mp4 │ │ 第一章第1节: 15-mybatis逆向工程.mp4 │ │ 第一章第1节: 16-mybatis PageHelper分页插件.mp4 │ ├─第3节 9月5日 Mybatis02-手写Mybatis框架
1 Mybatis第一天课堂笔记 学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架。 为什么学Mybatis? 1. 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用...
此项目是利用业余时间,对一些技术知识点进行整理,用来记录个人学习笔记。这个项目和 项目的不同在于 是用来动手实践,对于一些技术的实际搭建和造轮子的项目,正所谓实践出真知。相关的源码都会在上边。两个项目...
该平台旨在为学生提供一个方便、高效的读书笔记共享环境,帮助他们更好地学习和掌握知识。通过这个平台,学生可以上传、下载、查看和评论读书笔记,实现知识的共享和传播。主要功能如下:用户注册与登录:用户可以...
MartinHub的学习笔记 关于我 MartinHub :smiling_face_with_sunglasses: ,,热爱生活!热爱技术! 微信公众号【MartinHub】 个人微信号【MartinHub】 项目介绍 大数据 Java 数据库 Linux 杂记 :bullseye: :hot_...
学习管理:包括选课、学习进度、学习笔记、课程讨论等功能。 考试管理:包括在线考试、成绩查询、错题回顾等功能。 订单管理:包括购买课程、支付方式、订单查询等功能。 教师管理:包括教师入驻、课程发布、学生...
Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip 章节笔记 第1章-课程介绍及项目框架搭建 知识点 使用spring boot 搭建项目基础框架 使用Thymeleaf做页面展示,封装Result统一结果 集成 mybatis + ...
前后端分离技术,涵盖技术栈有:Vue、axios、Springboot、RESTful、mybatis、tkmapper、Swagger、任务调度Quartz/Elastic-Job、阿里云OSS、Linux、Nginx负载均衡、反向代理、CDN、容器化技术Docker、分布式缓存Redis...
个人学习笔记 python nginx AWS认证考试 技术路线 LB负载均衡 负载均衡常见使用场景,问题定位,特别是对于概率性出现的访问超时问题定位。包含如下组件 nginx lvs openresty kong apigateway 消息中间件 对于消息...
学习这个项目的时候,对其思路做了笔记,我这里按照自己的写法,与其略有不同, 但是基本思路都是一样的。 注意: 本机环境是jdk8,tomcat8,mysql5.7.13,windows下,IDE是IntelliJ IDEA, mongodb(mongodb-win32-...
在线学习模块提供了视频播放、笔记记录、进度保存等功能,方便用户随时随地进行学习;考试评估模块可以进行在线考试,系统会自动对用户的答题情况进行评分,并给出详细的答案解析。 系统界面美观,用户体验良好。...
技术栈方面,除了Spring Boot作为主要后端框架外,该项目可能还使用了如MyBatis或Hibernate的ORM框架,MySQL或PostgreSQL作为数据库,Redis用于缓存,以及前端技术如AngularJS、React或Vue.js等。该资源包适合软件...
learning-notes分布式1.Lambda表达式Java基础JVM设计模式数据库并发微服务消息队列1.RabbitMq缓存1.Redis集群方式(主从复制,哨兵模式和Redis-Cluster集群)2.Redis内存回收机制3.Redis笔记4.Redis Cluster原理5....
│ 淘淘商城第九天笔记.docx │ ├─10.第十天 │ 01.课后回顾.avi │ 02.课程计划.avi │ 03.单点登录系统的处理过程.avi │ 04.创建单点登录系统.avi │ 05.数据校验接口.avi │ 06.用户注册接口.avi │ 07.登录...