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

Mybatis-MyBatis的缓存

Mybatis-MyBatis的缓存

  • 一、MyBatis的一级缓存
  • 二、MyBatis的二级缓存
    • 二级缓存的相关配置
  • 三、MyBatis缓存查询的顺序

一、MyBatis的一级缓存

一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就
会从缓存中直接获取,不会从数据库重新访问
使一级缓存失效的四种情况:

  1. 不同的SqlSession对应不同的一级缓存
  2. 同一个SqlSession但是查询条件不同
  3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
  4. 同一个SqlSession两次查询期间手动清空了缓存
    @Testpublic void testCache() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession1 = sqlSessionFactory.openSession(true);CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);Emp emp1 = mapper1.getEmpById(1);System.out.println(emp1);Emp emp2 = mapper1.getEmpById(1);System.out.println(emp2);}

在这里插入图片描述

二、MyBatis的二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被
缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
二级缓存开启的条件:
a>在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置
b>在映射文件中设置标签
在这里插入图片描述

c>二级缓存必须在SqlSession关闭或提交之后有效
d>查询的数据所转换的实体类类型必须实现序列化的接口
使二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

    @Testpublic void testCache() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession1 = sqlSessionFactory.openSession(true);CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);Emp emp1 = mapper1.getEmpById(1);System.out.println(emp1);sqlSession1.close();SqlSession sqlSession2 = sqlSessionFactory.openSession(true);CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);Emp emp2 = mapper2.getEmpById(1);System.out.println(emp2);sqlSession2.close();}

在这里插入图片描述

二级缓存的相关配置

①eviction属性:缓存回收策略,默认的是 LRU。
LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。
FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
②flushInterval属性:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
③size属性:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
④readOnly属性:只读, true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重要的性能优势。
false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是
false。

三、MyBatis缓存查询的顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存
如果一级缓存也没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存

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

相关文章:

  • 计算机组成原理之硬件的基本组成,深入介绍两大计算机结构体系,从底层出发认识计算机。
  • 二十五、MySQL事务的四大特性和常见的并发事务问题
  • 辨析常见的医学数据分析(相关性分析回归分析)
  • SpringBoot项目中只执行一次的任务写法
  • TCK、TMS、TDI、TDO的含义
  • R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...
  • 【PowerShell】PowerShell的Core版本的额外配置
  • 数据结构----链式栈
  • 实在智能携手40+央企,探索财务大模型及数智化实践与应用
  • upload-labs文件上传1-5关
  • git的基本使用
  • Mac台式电脑内存清理方法教程
  • FL Studio怎么破解?2023年最新FL Studio 21图文安装激活教程?FL 21中文版下载 v21.1.1.3750 汉化 版
  • Zookeeper高级_四字命令
  • /usr/bin/ld: cannot find -lmysqlcllient
  • 折线图geom_line()参数选项
  • 百度SEO优化基本原理(掌握SEO基础,提高网站排名)
  • 2023 ICPC 网络赛 第一场 部分题解 (待完善)
  • Hadoop的HDFS高可用方案
  • 【计算机基础】让我们重新认识一下Visual Stduio及其操作,知识点汇总!!
  • 使用Node构建私人代理池
  • 2023年“羊城杯”网络安全大赛 决赛 AWDP [Break+Fix] Web方向题解wp 全
  • 如何用好免费的ChatGPT
  • golang 实现带令牌限流的JWT demo
  • 【web开发】9、Django(4)ajax请求
  • 消息队列中,如何保证消息的顺序性?
  • Shell别名的使用方法及管理技巧
  • C/C++选择题好题分享
  • kafka副本机制
  • 服务注册发现_actuator微服务信息完善