当前位置: 首页 > news >正文

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存

10.1、MyBatis的一级缓存

一级缓存是SqlSession级别的,通过同一个SqlSession对象 查询的结果数据会被缓存,下次执行相同的查询语句,就 会从缓存中(缓存在内存里)直接获取,不会重新访问数据库(数据库在磁盘里),也就是说就执行一次sql。一级缓存 默认开启

使一级缓存失效的四种情况:

  1. 不同的SqlSession对应不同的一级缓存

  2. 同一个SqlSession但是查询条件不同

  3. 同一个SqlSession两次查询之间执行了任意的增删改操作 。

    因为任意一次增删改操作会清空所有SqlSession的所有缓存---为什么?因为任意一次增删改可能会导致缓存的数据与增删改后的数据库中的数据不一致,我们肯定要以数据库中的为准,这是mybatis的机制,自动完成清空缓存。

  4. 同一个SqlSession两次查询期间手动清空了缓存

    sqlSession.clearCache();//手动清空一级缓存。一级缓存是sqlSession级别的

例子:

10.2、MyBatis的二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession对象 查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取 。二级缓存不是默认开启的,开启需满足条件。

二级缓存开启的条件:

a>在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置

b>在映射文件中设置标签 <cache>

c>二级缓存必须在SqlSession关闭或提交之后有效

d>查询的数据所转换的实体类类型必须实现序列化的接口

使二级缓存失效的情况:

两次查询之间执行了任意的增删改操作,会使一级和二级缓存同时失效

咱自己创建的sqlSessionUtil工具类,每调一次,都新建一个SqlSessionFactory,然后再新建一个sqlSession。要想测试二级缓冲,可以自己直接写,不使用工具类。

    @Testpublic void testCache2() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);SqlSession sqlSession1 = sqlSessionFactory.openSession(true);CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);Emp emp1 = mapper1.getEmpByEmpId(1);sqlSession1.close();System.out.println(emp1);SqlSession sqlSession2 = sqlSessionFactory.openSession(true);CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);Emp emp2 = mapper2.getEmpByEmpId(1);System.out.println(emp2);sqlSession2.close();}
Emp要实现序列化
映射文件里要加一个<cache>标签

10.3、二级缓存的相关配置

了解

在mapper配置文件中添加的cache标签可以设置一些属性:

①eviction属性:缓存回收策略,默认的是 LRU。

LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

②flushInterval属性:刷新间隔,单位毫秒 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

③size属性:引用数目,正整数 代表缓存最多可以存储多少个对象,太大容易导致内存溢出

④readOnly属性:只读, true/false

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重 要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。

10.4、MyBatis缓存查询的顺序

二级缓存的范围大于一级缓存的范围,也就是说,二级缓存中的数据要多于一级缓存中的。因为一个SqlSessionFactory可以对应多个SqlSession,而一个一级缓存只对应一个SqlSession。但是,SqlSession关闭之后,一级缓存中的数据才会写入二级缓存,所以,当SqlSession还没有关闭时,二级缓存中没有一级缓存中的一些数据,此时二级缓存可能没被命中,则查一级,若一级没命中(之前没有写入过一级缓存),则查数据库

查询顺序:2 ---> 1 ----> 数据库

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

如果二级缓存没有命中,再查询一级缓存

如果一级缓存也没有命中,则查询数据库

SqlSession关闭之后,一级缓存中的数据才会写入二级缓存

http://www.lryc.cn/news/195208.html

相关文章:

  • GitLab(1)——GitLab安装
  • 退税政策线上VR互动科普展厅为税收工作带来了强大活力
  • centos 7.9离线安装wget
  • 【Java学习之道】网络编程的基本概念
  • Restful API 设计示例
  • 为知笔记一个日记模板
  • 软件测试中如何测试算法?
  • CMOS图像传感器——Sony Ta-Kuchi图像传感器
  • 一文理解登录鉴权(Cookie、Session、Jwt、CAS、SSO)
  • LangChain结合milvus向量数据库以及GPT3.5结合做知识库问答之一 --->milvus的docker compose安装
  • 安装nginx,配置https,并解决403问题
  • RustDay04------Exercise[11-20]
  • 【Python第三方包】快速获取硬件信息和使用情况(psutil、platform)
  • 数据结构与算法课后题-第五章(哈夫曼树和哈夫曼编码)
  • 07测试Maven中依赖的范围,依赖的传递原则,依赖排除的配置
  • 科技为饮食带来创新,看AI如何打造智能营养时代
  • 软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析
  • 代码随想录算法训练营第23期day22|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
  • IDEA中创建Web工程流程
  • 【论文阅读】基于卷积神经的端到端无监督变形图像配准
  • 【Rust】包和模块,文档注释,Rust格式化输出
  • leetcode221.最大正方形
  • 低代码技术这么香,如何把它的开发特点发挥到极致?
  • drawio简介以及下载安装
  • Sql Server 数据库中的所有已定义的唯一约束 (列名称 合并过了)
  • elasticsearch (六)filebeat 安装学习
  • 算法通关村第一关|青铜|链表笔记
  • 【记录】使用Python读取Tiff图像的几种方法
  • JOSEF约瑟 多档切换式漏电(剩余)继电器JHOK-ZBL1 30/100/300/500mA
  • Linux部署kubeedge 1.4