mybatis缓存(学习笔记17)

1、什么是缓存:存在内存中的临时数据

      将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘(关系数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决高并发系统的性能问题。

2、为什么使用缓存

减少和数据库的交互次数,减少系统开销,提高系统效率

3、什么样的数据能使用缓存

经常查询并且不经常改变的数据

Mybatis缓存

mybatis系统中默认定义了两级缓存:一级缓存二级缓存

默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

二级缓存需要手动开启和配置,他是基于namespace级别的缓存

Mybatis定义了缓存接口Cache.我们可以通过实现Cache接口来自定义耳机缓存

一级缓存

一级缓存默认是开启的在sqlSession被创建到sqlSession.close(也就是sqlSession创建到关闭)

在同一个sqlSession中查询同一个数据就是从缓存中拿到的数据

public class Test1 {@Testpublic void test2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user1 = mapper.queryUserById(1);System.out.println(user1);System.out.println("========================");User user2 = mapper.queryUserById(1);System.out.println(user2);sqlSession.close();}
}

 从日志可以看到,只执行了一次sql语句

缓存失效的情况:

1、查询不同的数据,缓存会失效

public class Test1 {@Testpublic void test2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user1 = mapper.queryUserById(1);System.out.println(user1);System.out.println("========================");User user2 = mapper.queryUserById(2);System.out.println(user2);sqlSession.close();}
}

 

2、增删改操作,可能会改变原来的数据,所以必定会刷新缓存!

public class Test1 {@Testpublic void test2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);int i = mapper.updateUser(new User(1, "张三", ""));if(i > 0){sqlSession.commit();System.out.println("修改成功");}User user1 = mapper.queryUserById(1);System.out.println(user1);System.out.println("========================");User user2 = mapper.queryUserById(1);System.out.println(user2);System.out.println("========================");sqlSession.close();}
}

3、查询不同的Mapper.xml

4、手动清理缓存

public class Test1 {@Testpublic void test2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user1 = mapper.queryUserById(1);System.out.println(user1);//手动清理缓存sqlSession.clearCache();System.out.println("========================");User user2 = mapper.queryUserById(1);System.out.println(user2);System.out.println("========================");sqlSession.close();}
}

二级缓存

二级缓存也叫全局缓存,一级缓存的作用域太低了。所以诞生了二级缓存

基于namespsce级别的缓存,一个名称空间,对应一个二级缓存;

工作机制:一个绘画查询一条数据,这个数据就会被放在一级缓存中。

如果当前会话关闭了,这个会话对应的一级缓存就没有了,会话关闭后,一级缓存的数据被保存到二级缓存中;

新的会话查询信息,就可以从二级缓存中获取内容;

不同的mapper查出的数据会放在自己对应的缓存(map)中

步骤:

1、开启全局缓存

在配置文件settings标签中开启全局缓存

<setting name= "cacheEnabled" value="true" />

2、二级缓存只需要在sql映射文件中添加一行

<cache/>

也可以定义一些功能,看官网的具体介绍

3、测试

没有开启二级缓存时

public class Test1 {@Testpublic void test2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user1 = mapper.queryUserById(1);System.out.println(user1);sqlSession.close();System.out.println("========================");SqlSession sqlSession2 = MybatisUtils.getSqlSession();UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);User user2 = mapper2.queryUserById(1);System.out.println(user2);System.out.println("========================");sqlSession2.close();}
}

可以看到sql执行了两次

开启二级缓存后,只执行了一次sql

存在的问题,没有设置策略的时候,就是只使用<cache/>标签时需要注意 要将实体类序列化

否则就会报错

org.apache.ibatis.cache.CacheException: Error serializing object.  Cause: java.io.NotSerializableException: com.li.pojo.User

序列化实体类

总结:只要开启了二级缓存,缓存在同一个Mapper下就有效

所有的数据都会先放在一级缓存中

只有当会话提交,或者关闭的时候才会到二级缓存中

缓存的原理

用户执行查询之后

先在二级缓存中找看能不能找到

二级缓存没有再到一级缓存中找

一级缓存也没有最后走数据库

自定义缓存

网上去找一下配置文件就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/542692.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式与集群,二者区别是什么?

&#x1f413;分布式 分布式系统是由多个独立的计算机节点组成的系统&#xff0c;这些节点通过网络协作完成任务。每个节点都有自己的独立计算能力和存储能力&#xff0c;可以独立运行。分布式系统的目标是提高系统的可靠性、可扩展性和性能。 分布式服务包含的技术和理论 负…

EPSON X1G004481000300 SG7050CAN晶体振荡器

在射频拉远单元&#xff08;RRU&#xff09;设计中,一般需要用到以太网PHY芯片发送和接收以太网的数据帧,与主控芯片进行网络数据交互,为保证以太网PHY芯片正常工作,一般需要选择25MHz标准频率的有源晶振用于以太网PHY芯片时钟设计,为保证射频拉远单元&#xff08;RRU&#xff…

面向对象(下)

目录 01、static1.1、static的使用1.2、static应用举例1.3、单例(Singleton)设计模式 02、main方法的语法03、类的成员之四&#xff1a;代码块04、关键字&#xff1a;final05、抽象类与抽象方法5.1、多态的应用&#xff1a;模板方法设计模式(TemplateMethod) 06、接口(interfac…

《Learning Hierarchical Modular Networks for Video Captioning》论文笔记

论文信息 原文链接&#xff1a; Learning Hierarchical Modular Networks for Video Captioning | IEEE Journals & Magazine | IEEE Xplore 原文代码 GitHub - MarcusNerva/HMN: [CVPR2022] Official code for Hierarchical Modular Network for Video Captioning. Ou…

数字多空策略(实盘+回测+数据)

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常…

熔断降级的方案实现

熔断降级的方案实现 Spring Cloud Netflix Hystrix 提供线程隔离、服务降级、请求缓存、请求合并等功能可与Spring Cloud其他组件无缝集成官方已宣布停止维护&#xff0c;推荐使用Resilience4j代替 Spring Cloud Resilience4j 轻量级服务熔断库 提供类似于Hystrix的功能 具有更…

谁将是RAG的头部玩家?

开篇 菩提修妙树&#xff0c;接引证法源&#xff0c;屠龙万仙阵&#xff0c;玉虚祭封神。 混战是国内技术圈的常态&#xff0c;在众仙跟风与追捧的大潮中&#xff0c;如何看清方向至关重要&#xff0c;决定谁最终将封神。 语言大模型(LLM)&#xff0c;多模态(MM)&#xff0c;…

吴恩达deeplearning.ai:使用多个决策树随机森林

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 为什么要使用树集合使用多个决策树(Tree Ensemble)有放回抽样随机森林XGBoost(eXtream Gradient Boosting)XGBoost的库实现何时使用决策树决策树和树集合神经网络 使用单个决策树的…

SpringBoot集成Redisson实现接口限流

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Dat…

yolov8 分割 模型 网络 模块图

下图是使用yolov8n-seg-p6.yaml imgsz1472 类别数2的情况下训练得到的静态导出的onnx文件使用netron工具可视化的结果 简单标注了yolov8n-seg-p6.yaml配置文件中各层和netron工具可视化的结果的对应关系(head 中的 Segment除外)

【Codesys】-获取系统负载-获取总线周期计数和任务名字

获取PLC负载&#xff1a; 支持库&#xff1a; 获取每个当前Pou的任务周期计数、名字