Mybatis----缓存

MyBatis是一个流行的Java持久化框架,它提供了一个灵活的缓存机制来提高查询性能。

MyBatis的缓存机制主要分为一级缓存和二级缓存。

一级缓存是指在同一个SqlSession中,查询结果会被缓存起来,当再次执行同样的查询时,直接从缓存中获取结果,而不需要再次发起数据库查询。一级缓存是MyBatis默认启用的,可以通过配置来禁用。

二级缓存是指多个SqlSession之间共享的缓存,它可以减少数据库的访问次数,提高性能。默认情况下,二级缓存是禁用的,需要手动配置开启。可以使用一些第三方插件(比如EhCache或Redis)来实现二级缓存。

要启用二级缓存,需要在MyBatis的配置文件中配置相应的缓存配置。在映射文件中,可以使用<cache>标签来配置二级缓存的相关属性,比如缓存类型、缓存过期时间等。

1.一级缓存

Mybatis默认开启一级缓存,当在同一个会话中多次查询同一个语句,Mybatis会自动使用一级缓存获取查询结果。

@Test
public void test2() throws IOException {SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);System.out.println("第一次查询:");System.out.println(mapper.selectAll());System.out.println("第二次查询");System.out.println(mapper.selectAll());sqlSession.close();}

由此可见,第二此次查询是从一级缓存中拿到的结果。

修改语句,将查询语句之间插入一条删除语句

一级缓存会在删除时自动清除,不仅仅是删除,增加,更新也会使一级缓存清除。

不同的会话对象不会共享缓存

@Test
public void test2() throws IOException {SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();SqlSession anthorSqlSession=sqlSessionFactory.openSession();AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);AccountMapper anthorMapper = anthorSqlSession.getMapper(AccountMapper.class);System.out.println("第一次查询:");System.out.println(mapper.selectAll());System.out.println("第二次查询");System.out.println(anthorMapper.selectAll());sqlSession.close();}

一级缓存仅仅在同一会话中生效

2.二级缓存

Mybatis中一个SqlSessionFactory对应一个数据库,而二级缓存就是SqlSessionFactory级别的。

开启二级缓存需要一下步骤

1.全局的开启关闭映射文件中配置的缓存
<settings><setting name="cacheEnable" value="true"/>
</settings>

默认值就是true

2.在映射文件中配置<cache></cache>
3.映射文件映射的实体类必须为可序列化类

实现Serializable接口

4.会话必须提交或者是关闭,值才能写入二级缓存
测试
public void test2() throws IOException {SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();SqlSession anthorSqlSession=sqlSessionFactory.openSession();AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);AccountMapper anthorMapper = anthorSqlSession.getMapper(AccountMapper.class);System.out.println("第一次查询:");System.out.println(mapper.selectAll());sqlSession.commit();System.out.println("第二次查询");System.out.println(anthorMapper.selectAll());sqlSession.close();}

注意:当出现增加,删除,更新语句的时候,二级缓存通用会被清除

二级缓存的驱逐策略

MyBatis的二级缓存提供了多种驱逐策略(Eviction Strategy)来管理缓存中的对象,确保缓存不会无限增长并占用过多的内存。以下是一些常见的驱逐策略:

  1. LRU(Least Recently Used):最近最少使用策略会驱逐最近最少被使用的对象。当缓存达到设定的大小上限时,将会移除最近最少被使用的对象。
  2. FIFO(First In, First Out):先进先出策略会按照对象最先进入缓存的顺序进行驱逐。当缓存达到设定的大小上限时,最先进入缓存的对象将会被移除。
  3. Soft References:软引用策略使用Java的软引用机制,当内存不足时,垃圾回收器会根据软引用对象的使用情况来回收内存。这样可以让缓存中的对象在内存不足时被回收,避免内存溢出。
  4. Time To Live(TTL):时间驱逐策略允许为缓存中的对象设置一个存活时间,在存活时间到期后,缓存中的对象将被驱逐。

例如:

<cache eviction="FIFO"></cache>

总结一下,MyBatis的缓存机制包括一级缓存和二级缓存,一级缓存默认启用且无需配置,一级缓存是SqlSession级别的缓存;二级缓存需要手动配置启用,可以减少数据库的访问次数,提高性能,是多个SqlSession共享的缓存。

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

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

相关文章

基于SSM的企业文档管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是何时&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML 我欲乘风归去 又恐琼楼玉宇 高处不胜寒 -苏轼 一、项目简介 现代经济快节奏发展以及不断完善升级的信息化技术&…

latex图文混排示例

\parbox[t]{0.7\textwidth}{ 本题属于利用信号量实现前驱的经典问题&#xff0c;操作C必须在A和B完成后执行&#xff0c; 操作E必须在C和D完成后执行&#xff0c;其执行顺序如右图所示。 定义同步信号量A、B、C、D&#xff0c;一开始四个操作都未执行&#xff…

深度了解TCP/IP模型

网络通信是现代社会不可或缺的一部分&#xff0c;而TCP/IP模型作为网络通信的基石&#xff0c;扮演着至关重要的角色。本文将深入探讨TCP/IP模型的概念、结构及其在网络通信中的作用&#xff0c;为读者提供全面的了解。 一.TCP/IP模型简介 TCP/IP模型是一个网络通信协议体系&a…

【Java并发编程的艺术学习】第七,八章摘要

原子更新基本类型类 1.原子操作类&#xff1a;多线程下的操作是安全的&#xff0c;不需要自己加锁 2.在原子类中不能用 - * / ,而是采用这些方法 AtomicBoolean&#xff1a;原子更新布尔型 AtomicInteger&#xff1a;原子更新整形 AtomicLong&#xff1a;原子更新长整型 …

怎样设计一个具有良好容灾性的系统架构?

设计一个具有良好容灾性的系统架构 当你的系统出现故障时&#xff0c;容灾性设计可以让你的系统保持高效运转&#xff0c;避免数据丢失和业务中断。那么&#xff0c;怎样设计一个具有良好容灾性的系统架构呢&#xff1f;让我来教你几招&#xff0c;不过在开始之前&#xff0c;…

机器学习 | 掌握Matplotlib的可视化图表操作

Matplotlib是python的一个数据可视化库&#xff0c;用于创建静态、动态和交互式图表。它可以制作多种类型的图表&#xff0c;如折线图、散点图、柱状图、饼图、直方图、3D 图形等。以渐进、交互式方式实现数据可视化。当然博主也不能面面俱到的讲解到所有内容&#xff0c;详情请…

【极数系列】Flink 初相识(01)

# 【极数系列】Flink 初相识&#xff08;01&#xff09; 引言 Flink官网&#xff1a;https://flink.apache.org/ Flink版本&#xff1a;https://flink.apache.org/blog/ Flink文档&#xff1a;https://ci.apache.org/projects/flink/flink-docs-release-1.12/ Flink代码库…

AI存在信任问题,区块链能提供帮助吗?

区块链的商业应用&#xff0c;比如供应链追踪&#xff0c;一直以来都没有取得成功。但有人表示&#xff0c;该技术可能作为一种验证人工智能算法的工具而找到其存在的价值。 确保人工智能算法的安全性、公正性和准确性的困难正使一些公司转向一种曾被吹捧为革命性但在商业领域…

轻松互换文件夹名,高效批量改名!高手工具助您一臂之力!

在日常工作中&#xff0c;我们经常需要处理大量的文件夹&#xff0c;有时候需要将文件夹名称互换或进行批量改名。这时&#xff0c;一款高效、实用的高手工具就能派上用场。它不仅能帮助您轻松实现文件夹名互换&#xff0c;还能快速批量改名&#xff0c;让您的工作更加高效、轻…

Unity - 角色控制

Test_05 角色控制 创建一个3D对象作为角色&#xff0c;添加 “CharacterController” 组件来控制角色移动&#xff0c;绑定脚本"PlayerControl"。 PlayerControl public class PlayerControl : MonoBehaviour {private CharacterController player;void Start(){p…

RabbitMQ系列之入门级

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ系列之入门级》。&#x1f3af;&#x…

防火墙基础1

防火墙简绍 什么是防火墙? 状态防火墙工作原理? 防火墙如何处理双通道协议? 防火墙如何处理nat? 路由交换终归结底是连通性设备。 网络在远古时期没有防火墙大家都是联通的&#xff0c;any to any。 防御对象&#xff1a; 授权用户 非授权用户 防火墙是一种隔离…

存储开发入门到进阶,这几本书一定要看!!

有些朋友是已经深耕存储多年&#xff0c;有的朋友是刚刚入门、或者说有兴趣但是迟迟不得入门。以下从笔者的经验出发&#xff0c;向大家推荐几本书&#xff0c;可以比较系统的补充一些编程的内功和存储的基础知识&#xff0c;向你展示一条存储通关之路。 语言 语言是第一个要…

SpringBoot服务设置禁止server.point端口的使用

问题&#xff1a; 当项目服务引用了jar spring-boot-starter-web后 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>所以项目一启动&#xff0c;就会使用serv…

网络中的长连接和短连接

在网络通信中&#xff0c;长连接和短连接是两种不同的连接方式。它们指的是客户端和服务器之间持续通信的时间。 短连接 短连接是一种临时性的连接&#xff0c;客户端发送请求后&#xff0c;服务器响应请求并传输数据后&#xff0c;连接会立即关闭。每次请求都需要建立一个新的…

Git将当前分支暂存切换到其他分支

在我们使用Git进行版本控制时&#xff0c;经常会遇到这样的情况&#xff1a;我们正在一个分支上进行一些修改&#xff0c;但突然需要切换到另一个分支进行一些操作。这时&#xff0c;我们可以使用git stash命令来暂存我们的修改&#xff0c;然后再切换到其他分支。下面&#xf…

55. 跳跃游戏 - 力扣(LeetCode)

题目描述 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 题目示例 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以先跳 1 步&#x…

LFU算法

LFU算法 Least Frequently Used&#xff08;最不频繁使用&#xff09; Leetcode有原题&#xff0c;之前手写过LRU&#xff0c;数据结构还是习惯于用java实现&#xff0c;实现是copy的评论题解。 题解注释写的很清楚 大致就是说LFUCache类维护一个存放node的map&#xff0c;同…

go语言入门介绍 - 特征、命名、关键字、保留字、声明

Go 语言是谷歌 2009 年首次推出并在 2012 年正式发布的一种全新的编程语言&#xff0c;可以在不损失应用程序性能的情况下降低代码的复杂性。 1、优点 自带gc。静态编译&#xff0c;编译好后&#xff0c;扔服务器直接运行。简单的思想&#xff0c;没有继承&#xff0c;多态&a…

基于springboot+vue的墙绘产品展示交易平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…