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标签
基本实现
- 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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
[外链图片转存中…(img-bTT0H6J1-1713528000694)]
还有源码相关的阅读学习
[外链图片转存中…(img-kwjVlZ4Y-1713528000694)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!