MyBatis缓存机制 ▎特殊符号处理

news2024/12/23 5:06:41

前言:

MyBatis 的缓存机制通过一级缓存和二级缓存显著提升系统性能。一级缓存在 SQL 会话中减少重复查询,二级缓存跨会话共享查询结果,但引入了数据一致性和内存管理的挑战。开发者需平衡性能与数据准确性。此外,MyBatis 还提供了多种方法来安全处理 SQL 中的特殊符号,防止 SQL 注入,并灵活应用动态 SQL。这些功能对于优化性能和确保数据安全至关重要

特殊符号处理

MyBatis中的sql是在xml文件中编写的,所以我们就不可以做直接编写 >  < 等特殊符号

解决方法一:  <   对应: &lt    > 对应: &gt   '' 对应: &quot   , 对应: &apos  & 对应: &amp    

解决方法二:将特殊符号书写<![CDATA[特殊符号]]>   将特殊符号填写在第二个中括号中

MyBatis缓存机制

什么是缓存?

缓存 (Cache):是一种用于临时存储数据的技术,将数据临时存储在内存中

缓存作用

缓存(cache)的作用是为了减去数据库的压力,提高查询性能。缓存实现的 原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存) 中,当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库 执行 select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能

缓存机制

如果有缓存查询流程,先从缓存中查数据,如果缓存中没有,去数据库查询,查询到后把数据放到缓存中,下次直接从缓存中获取

MyBatis一级缓存

   Mybatis以及缓存,默认是sqlSession级别的,再同一个SqlSession中查询到数据先缓存SqlSession对象中,第二次查询数据时,先从SqlSession中查询,如果有直接返回,没有,再去数据库查

一级缓存生命周期:

   开始于:SqlSession创建

   结束于:

  1. SqlSession关闭 ----->  sqlSession.close()
  2. 如果期间执行了新增,修改,删除操作,也会清空SqlSession对象中的缓存
  3. 调用SqlSession.cleanCache()强制清空一级缓存

代码演示解释缓存:

    public void find() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        TeacherDao teacherDao = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher1 = teacherDao.findTeacherById(4);
        Teacher teacher2 = teacherDao.findTeacherById(4);
        Teacher teacher3 = teacherDao.findTeacherById(4);
        Teacher teacher4 = teacherDao.findTeacherById(4);
        System.out.println(teacher1);
        System.out.println(teacher2);
        System.out.println(teacher3);
        System.out.println(teacher4);
        sqlSession.close();
    }

我们这里多次查询teacher,然后放在不同的对象中

结果:

画图解释:

MyBatis二级缓存

  二级缓存是SqlSessionFactory级别,可以让多个SqlSession共享数据

  mybatis默认没有开启二级缓存,使用时需要配置开启

  如果开启了二级缓存,当SqlSession关闭时,会将一级缓存的数据缓存到二级缓存中,其他的SqlSession就可以从二级缓存中查询到之前的SqlSession缓存的数据

如何开启二级缓存

第一步:在MyBatis配置文件中配置

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
<!--        <setting name="autoMappingBehavior" value="FULL"/> &lt;!&ndash;设置多张表自动映射-->
        <setting name="cacheEnabled" value="true"/> <!--开启二级缓存-->
    </settings>

第二步:配置映射文件

在 Mapper 映射文件中添加<cache />,表示此 mapper 开启二级缓存. 当 SqlSeesion 关闭时,会将数据存入到二级缓存

第三步:对象序列化

被缓存的 POJO(实体类)必须实现序列化接口(implements Serializable)

代码演示:

    public void find() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        TeacherDao teacherDao = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher = new Teacher();
        teacher =  teacherDao.findTeacherById(4);
        System.out.println(teacher);
        sqlSession.close();

        SqlSession sqlSession1 = MyBatisUtil.getSqlSession();
        TeacherDao teacherDao1 = sqlSession1.getMapper(TeacherDao.class);
        Teacher teacher1 = new Teacher();
        teacher1 =  teacherDao1.findTeacherById(4);
        System.out.println(teacher1);
        sqlSession.close();
    }

二级缓存优缺点 

优点:

  1. 提高性能

    • 二级缓存可以显著减少数据库访问的次数,尤其是在相同的数据被多次查询的情况下,从而提高应用的整体性能。
  2. 减少数据库压力

    • 通过缓存经常使用的数据,可以减少对数据库的压力,减少数据库的负载和响应时间。
  3. 灵活配置

    • MyBatis 的二级缓存支持自定义实现,你可以根据具体需求调整缓存的存储方式、过期时间等参数。
  4. 缓存隔离

    • 每个 MyBatis 的映射器(Mapper)都拥有独立的二级缓存,这样可以防止不同模块之间的缓存数据相互干扰,提高了缓存的可靠性。

缺点:

  1. 数据一致性问题

    • 缓存数据可能变得陈旧(stale),尤其是在涉及多方更新的情况下,可能导致缓存中的数据和数据库中的实际数据不同步,出现数据不一致的问题。
  2. 额外的内存开销

    • 二级缓存会占用一定的内存资源,缓存的数据越多,占用的内存也越多。如果不加以控制,可能导致内存压力增大。
  3. 配置复杂度

    • 对于初学者或项目复杂性较高的情况,正确配置二级缓存可能需要更多的经验和时间。
  4. 无法缓存多表联合查询结果

    • 二级缓存通常只能缓存单表查询的结果,复杂的多表联合查询结果缓存效果不佳。
  5. 需要注意缓存失效机制

    • 如果缓存未正确失效,可能会导致数据不一致,因此需要精心设计缓存的失效策略。

<cache>标签

1. type

  • 解释:指定缓存的实现类,通常用于自定义缓存。
  • 默认值org.apache.ibatis.cache.impl.PerpetualCache
  • 示例<cache type="com.example.MyCustomCache"/>

2. eviction

  • 解释:指定缓存的回收策略,也就是缓存满了之后,如何清除旧的数据。常用策略有:
    • LRU (Least Recently Used):最近最少使用的策略,移除最久未被使用的对象。
    • FIFO (First In, First Out):先进先出策略,按照进入缓存的顺序来移除对象。
    • SOFT:软引用,基于垃圾回收器的回收情况来移除对象。
    • WEAK:弱引用,当垃圾回收器运行时,总是会移除。
  • 默认值LRU
  • 示例<cache eviction="FIFO"/>

3. flushInterval

  • 解释:指定缓存的刷新间隔时间(单位是毫秒),也就是多长时间后缓存将自动刷新。如果不设置,缓存不会自动刷新,直到某个条件触发时才会失效。
  • 默认值:没有默认值(即缓存不会自动刷新)。
  • 示例<cache flushInterval="60000"/>(缓存每分钟刷新一次)

4. size

  • 解释:指定缓存的大小,也就是缓存中可以存放多少条查询结果。在超出这个大小时,将按照 eviction 策略进行缓存回收。
  • 默认值:没有默认值(缓存大小无限制,但取决于内存容量)。
  • 示例<cache size="512"/>(最多缓存 512 条查询结果)

5. readOnly

  • 解释:指定缓存的数据是否只读。只读缓存可以提高性能,因为 MyBatis 可以在多个线程之间安全地共享这些缓存对象,但它们不能被修改。如果设置为 false,则缓存中的对象是可变的,且不会被多个线程共享。
  • 默认值false
  • 示例<cache readOnly="true"/>

6. blocking

  • 解释:指定是否启用阻塞缓存。在阻塞缓存模式下,当某个缓存键值的数据正在加载时,其他请求将被阻塞,直到加载完成。
  • 默认值false
  • 示例<cache blocking="true"/>

 



 感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!

                                       希望路飞的笑容可以治愈努力路途中的你我!

博主vx:Dreamkid05 --->欢迎大家和博主讨论问题 

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

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

相关文章

力扣经典题目之->二叉树的前序遍历

一&#xff1a;题目 解释&#xff1a; 1&#xff1a; 题目的要求就是我们return 一个数组&#xff0c;该数组里面的元素及其顺序就是 前序遍历二叉树 的元素及其顺序 比如&#xff1a;示例1的树&#xff0c;前序遍历的顺序应该是1 2 3&#xff0c;那么return 的数组里面的元素…

Java面试题--JVM大厂篇之JVM大厂面试题及答案解析(8)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博…

Linux开发环境搭建,虚拟机安装

开发环境搭建 一、VMware Workstation Pro软件简介 VMware Workstation Pro 是 VMware &#xff08;威睿公司&#xff09;发布的一代虚拟机软件&#xff0c;中文名称一般称 为 "VMware 工作站 ". 它的主要功能是可以给用户在单一的桌面上同时运行不同的操作系统…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…

秃姐学AI系列之:残差网络 ResNet

目录 残差网络——ResNet 残差块思想 ResNet块细节 ResNet架构 总结 代码实现 残差块 两种 ResNet 块的情况 ResNet 模型 QA 由上图发现&#xff0c;只有当较复杂的函数类包含较小的函数类时&#xff0c;才能确保提高它们的性能。 对于深度神经网络&#xff0c;如果…

QGIS制图流程

在之前我们推送了QGIS的软件安装、插件安装、数据导入等基础操作&#xff0c;今天我们介绍一下QGIS的制图功能。QGIS的制图与ArcGIS Pro存在一定的区别&#xff0c;但是思路上相似。我们教程内容主要是参考QGIS官方文档&#xff1a; https://docs.qgis.org/3.34/en/docs/user_…

Android 中ebpf 的集成和调试

1. BPF 简介 BPF&#xff0c;是Berkeley Packet Filter的简称&#xff0c;最初构想提出于 1992 年。是一种网络分流器和数据包过滤器&#xff0c;允许早操作系统级别捕获和过滤计算机网络数据包。它为数据链路层提供了一个原始接口&#xff0c;允许发送和接收原始链路层数据包…

安卓中回调函数的使用

在Android开发中&#xff0c;回调函数是一种常见的编程模式&#xff0c;用于在某个任务完成时异步接收通知或数据。它们通常用于处理用户界面事件、完成网络请求、数据库操作或其他长时间运行的任务。回调&#xff08;Callback&#xff09;是一种允许某段代码通知另一段代码执行…

机器人学——机械臂轨迹规划-2

直线轨迹 线段转折点速度不连续 加速度状态讨论 double dot 多段直线轨迹&#xff0c;转折点利用二次方程转为圆弧 关键步骤 第一个线段处理 Vt V0 at , 此处的V0 0 , 利用函数连续性&#xff0c;左右速度相等&#xff0c;联立求解 sgn(x):符号函数 最后一个线段…

dubbo:dubbo服务负载均衡、集群容错、服务降级、服务直连配置详解(五)

文章目录 0. 引言1. dubbo负载均衡1.1 负载均衡算法1.2. dubbo负载均衡使用1.3 自定义负载均衡策略 2. dubbo服务容错2.1 8种服务容错策略2.2 自定义容错策略 3. dubbo服务降级&#xff08;mock&#xff09;4. dubbo服务直连5. 总结 0. 引言 之前我们讲解了dubbo的基本使用&am…

内部类java

内部类就是定义在一个类里面的类&#xff0c;里面的类可以理解成&#xff08;寄生&#xff09;&#xff0c;外部类可以理解成&#xff08;寄主&#xff09;。 //外部类 public class people{//内部类public class heart{} } 内部类的使用场景、作用 1.当一个事物的内部&…

STM32学习笔记3---ADC,DMA

目录 ADC模拟数字转换器 规则组的四种转换模式 AD单通道 AD多通道 常用代码函数相关 DMA直接存储器 存取&#xff08;访问&#xff09; 两个应用 DMA存储器到存储器的转运 ADCDMA ADC模拟数字转换器 stm32数字电路&#xff0c;只有高低电平&#xff0c;无几V电压的概念…

MySQL:常用函数

MySQL&#xff1a;常用函数 日期时间函数字符串函数数学函数加密函数 在MySQL中&#xff0c;存在许多现成的函数&#xff0c;可以简化部分操作&#xff0c;本博客讲解MySQL中的常用函数。 日期时间函数 current_date current_date函数用于输出当前的日期&#xff1a; curren…

一道关于php文件包含的CTF题

一、源码 这是index.php的页面。 点击login后会发现url里多了action的参数&#xff0c;那么我们就可以通过它来获取源码。 ?actionphp://filter/readconvert.base64-encode/resourcelogin.php 再通过base64的解码可以查看源码。 index.php源码&#xff1a; <?php erro…

【编码解码】CyberChef v10.18.9

下载地址 【编码解码神器】CyberChef v10.18.9 在线地址 CyberChef (gchq.github.io) 简介 CyberChef 是一个简单易用的网页应用&#xff0c;&#xff0c;包含了四百多种在线编解码工具。它在浏览器中执行各种“网络安全”操作。这些操作包括简单的 XOR 和 Base64 编码、复…

基于单片机的无线空气质量检测系统设计

本设计以STC89C52单片机为核心&#xff0c;其中包含了温湿度检测模块、光照检测模块、PM2.5检测模块、报警电路、LCD显示屏显示电路、按键输入模块和无线传输模块来完成工作。首先&#xff0c;系统可以通过按键输入模块设置当前的时间和报警值&#xff1b;使用检测模块检测当前…

spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课) Spring boot的batch框架&#xff0c;以及Swagger3(OpenAPI)整合 学习内容&#xff1a; Spring boot的batch框架Spring boot的Swagger3&#xff08;OpenAPI&#xff09;整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…

个人网站免费上线

声明一下&#xff0c;小科用的是natapp&#xff0c;进行的 1.起步-下载安装 去浏览器搜索" natapp "&#xff0c;在官网下载&#xff0c;或者直接 点击下列网站 NATAPP-内网穿透 基于ngrok的国内高速内网映射工具https://natapp.cn/ 打开后下滑找到下载&#xff…

JMeter Plugins之内网插件问题解决

JMeter Plugins之内网插件问题解决 背景 在我司内部进行JMeter工具进行性能脚本开发时&#xff0c;为了提高测试效率&#xff0c;我们会用到部分JMeter提供的插件&#xff0c;但是在我司内网的情况下&#xff0c;我们如果直接点击JMeter界面右上角的插件按钮 弹出来的JMeter…

洛谷刷题(4)

P1089 [NOIP2004 提高组] 津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随…