全网最全MyBatis基于XML使用系列四:缓存

try{

EmpMapper mapper=sqlSession.getMapper(EmpMapper.class);

List list=mapper.selectAllEmp();

for(Emp emp:list){

System.out.println(emp);

}

System.out.println(“=============”);

List list2=mapper.selectAllEmp();

for(Emp emp:list2){

System.out.println(emp);

}

}catch(Exception e){

e.printStackTrace();

}finally{

sqlSession.close();

}

分析:虽然在上面的代码中我们查询了两次,但最后只执行了一次数据库操作,这就是Mybatis提供的一级缓存在起作用了。因为一级缓存的存在,导致第二次查询id为1的记录时,并没有发出sql语句从数据库中查询数据,而是从一级缓存中查询。

一级缓存失效情况

开启多个SqlSession,缓存失效

一级缓存是sqlSession级别的缓存,如果在应用程序中只有开启了多个sqlsession,那么会造成缓存失效

@Test

public void test02() {

SqlSession sqlSession = sqlSessionFactory.openSession();

EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

List list = mapper.selectAllEmp();

for (Emp emp : list) {

System.out.println(emp);

}

System.out.println(“================================”);

SqlSession sqlSession2 = sqlSessionFactory.openSession();

EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);

List list2 = mapper2.selectAllEmp();

for (Emp emp : list2) {

System.out.println(emp);

}

sqlSession.close();

sqlSession2.close();

}

参数不一致,缓存失效

发送过程中发生了数据的修改,缓存失效

@Test

public void test03() {

SqlSession sqlSession = sqlSessionFactory.openSession();

EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

Emp empByEmpno = mapper.findEmpByEmpno(1111);

System.out.println(empByEmpno);

System.out.println(“================================”);

empByEmpno.setEname(“zhangsan”);

int i = mapper.updateEmp(empByEmpno);

System.out.println(i);

System.out.println(“================================”);

Emp empByEmpno1 = mapper.findEmpByEmpno(1111);

System.out.println(empByEmpno1);

sqlSession.close();

}

在两次查询期间,手动去清空缓存,缓存失效

@Test

public void test03() {

SqlSession sqlSession = sqlSessionFactory.openSession();

EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

Emp empByEmpno = mapper.findEmpByEmpno(1111);

System.out.println(empByEmpno);

System.out.println(“================================”);

System.out.println(“手动清空缓存”);

sqlSession.clearCache();

System.out.println(“================================”);

Emp empByEmpno1 = mapper.findEmpByEmpno(1111);

System.out.println(empByEmpno1);

sqlSession.close();

}

总结

特点:

  • 1.默认就开启了,也可以关闭一级缓存 localCacheScope=STATEMENT

  • 2.作用域:是基于sqlSession(默认),一次数据库操作会话。

  • 3.缓存默认实现类PerpetualCache ,使用map进行存储的

  • 4.查询完就会进行存储

  • 5.先从二级缓存中获取,再从一级缓存中获取 * key==> sqlid+sql

失效情况:

  • 1.不同的sqlSession会使一级缓存失效

  • 2.同一个SqlSession,但是查询语句不一样

  • 3.同一个SqlSession,查询语句一样,期间执行增删改操作

  • 4.同一个SqlSession,查询语句一样,执行手动清除缓存

二级缓存


二级缓存是namespace级别的缓存,他比一级缓存更加底层,一般情况下Mybatis是默认不开启二级缓存的。

如果需要开启二级缓存那么则需要实现一下两个条件

  • 实体类必须序列化

  • 在xml配置文件中配置cache标签

image.png

基本实现

  • 1、全局配置文件中添加如下配置:
  • 2、配置EmpMapper.xml映射

  • 3、修改实体类必须要实现Serializable接口

  • 4、测试实现

@Test

public void test04() {

SqlSession sqlSession = sqlSessionFactory.openSession();

SqlSession sqlSession2 = sqlSessionFactory.openSession();

EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);

Emp empByEmpno = mapper.findEmpByEmpno(1111);

System.out.println(empByEmpno);

sqlSession.close();

Emp empByEmpno1 = mapper2.findEmpByEmpno(1111);

System.out.println(empByEmpno1);

sqlSession2.close();

}

缓存标签属性

  • eviction:表示缓存回收策略,默认是LRU

  • LRU:最近最少使用的,移除最长时间不被使用的对象

  • FIFO:先进先出,按照对象进入缓存的顺序来移除

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

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

  • flushInternal:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

  • size:引用数目,正整数

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-bTT0H6J1-1713528000694)]

还有源码相关的阅读学习

[外链图片转存中…(img-kwjVlZ4Y-1713528000694)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值