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

2024-08-27 23:04

本文主要是介绍MyBatis缓存机制 ▎特殊符号处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

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 --->欢迎大家和博主讨论问题 

这篇关于MyBatis缓存机制 ▎特殊符号处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113033

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe