MyBatis缓存

devtools/2024/11/16 21:47:59/

目录

一、MyBatis缓存概述

二、一级缓存

三、二级缓存

四、自定义缓存

五、缓存策略与优化


MyBatis的缓存机制是其性能优化的重要组成部分,它通过缓存对象来存储查询结果,以减少数据库访问次数,从而提高查询性能。以下是对MyBatis缓存的详细解析:

一、MyBatis缓存概述

MyBatis提供了两种类型的缓存:一级缓存和二级缓存。这两种缓存类型在作用域、配置方式、使用场景等方面存在差异。

二、一级缓存

  1. 定义:一级缓存是MyBatis的默认缓存,也称为本地缓存或SqlSession级别的缓存

  2. 作用域:一级缓存的作用域是一个SqlSession对象内。在同一个SqlSession中执行的多次查询,如果查询条件相同,则会从一级缓存中获取结果,而不需要再次访问数据库。

  3. 配置:一级缓存默认是开启的,无需额外配置。

  4. 工作流程

    • 当执行查询时,MyBatis会首先检查一级缓存中是否存在相同查询条件的结果。
    • 如果存在,则直接返回缓存中的结果。
    • 如果不存在,则访问数据库获取结果,并将结果存储到一级缓存中。
  5. 失效情况

    • 不同的SqlSession对应不同的一级缓存
    • 在同一个SqlSession中,如果两次查询期间执行了增删改操作,则一级缓存会失效。
    • 手动调用SqlSession的clearCache()方法也会清空一级缓存

三、二级缓存

  1. 定义:二级缓存是Mapper级别的缓存,多个SqlSession可以共享同一个Mapper的二级缓存

  2. 作用域:二级缓存的作用域是基于命名空间的,即一个Mapper接口对应一个二级缓存

  3. 配置:二级缓存默认是关闭的,需要在Mapper映射文件中手动配置开启。配置方式包括在mapper.xml文件中添加<cache/>标签,或在Mapper接口上使用@CacheNamespace注解。

  4. 特点

    • 二级缓存实现了缓存数据的共享,可控性更强。
    • 需要注意缓存的失效策略,以避免数据的脏读或过期数据的使用。
    • 在分布式环境下,使用二级缓存需要谨慎,因为可能会出现读取到错误数据的情况。
  5. 应用场景

    • 查询频率高且数据不经常变动的场景。
    • 多个会话共享相同数据的场景。
    • 需要减轻数据库负载的高并发场景。
  6. 工作流程

    • 当执行查询时,MyBatis会首先检查二级缓存中是否存在相同查询条件的结果。
    • 如果存在,则直接返回缓存中的结果。
    • 如果不存在,则访问数据库获取结果,并将结果存储到二级缓存中。同时,一级缓存中也会存储该结果(如果当前SqlSession存在一级缓存的话)。

四、自定义缓存

除了一级缓存和二级缓存外,MyBatis还支持自定义缓存。自定义缓存可以根据业务需求和性能要求,选择合适的缓存实现和策略。自定义缓存的配置方式相对复杂,需要在MyBatis的配置文件中进行详细的设置。

五、缓存策略与优化

  1. 选择合适的缓存类型:根据业务需求和性能要求,选择合适的缓存类型(一级缓存、二级缓存或自定义缓存)。
  2. 避免频繁更新数据:更新操作会导致缓存失效,影响查询性能。因此,应尽量避免频繁更新数据。
  3. 合理配置缓存大小和过期时间缓存大小和过期时间的设置需要根据实际情况进行调整,以避免缓存数据过多或过期造成性能问题。
  4. 提高缓存命中率:在查询操作中使用缓存注解或手动控制缓存,以提高缓存命中率

http://www.ppmy.cn/devtools/134530.html

相关文章

「实战应用」如何用图表控件LightningChart .NET在WPF中制作表格?(二)

LightningChart .NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科…

pyinstaller+upx给python GUI程序添加自定义图标

一、在线.ico图标生成 windows用48x48尺寸 https://www.ico51.cn/ 二、upx打包图标工具 https://upx.github.io/ 三、UI文件生成py代码 pyside2-uic window.ui > window.py 四、打包命令 1、–icon&#xff1a;这个是.ico图标路径 2、–upx-dir&#xff1a;upx打包工…

uniapp中多角色导致tabbar过多的解决方式

由于项目时间较紧张&#xff0c;找了很多却没找到特别合适的方法&#xff0c;最后使用了此方式。 一、自己封装tabbar组件 这里就不介绍怎么封装了&#xff0c;先说一下缺点&#xff1a; 1.跳转会有白屏问题&#xff08;并且搜了好多资料以及查看官网发现没有特别合适的方法…

求字符 ‘a‘ 和 ‘b‘ 组成的,最大长度为n的字符串中字典序第 k 个字符串

求字符 ‘a’ 和 ‘b’ 组成的&#xff0c;最大长度为n的字符串中字典序第 k 个字符串 先来解释一下这个题目&#xff0c;假设最大长度为3&#xff0c;那么由字符a和b组成的字符串有&#xff1a; a, b, ab, aaa, aba...把这些字符串按照字典序排序: aaaaaaaabababaabbbbabaab…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

EXPLAIN优化慢SQL

项目中发现数据查询很慢&#xff0c;导致前端超时等待的问题。经过日志打印发现&#xff0c;查询sql耗时10秒以上&#xff0c;相关sql如下&#xff1a; select distincttablemodel.*from pjtask_model tablemodelJOIN buss_type_permission a ON (tablemodel.fields_data_id …

【分布式】CAP理论

CAP定理的核心要点&#xff1a; CAP定理指出&#xff0c;任何一个分布式系统在面对网络分区&#xff08;Partition&#xff09;的情况下&#xff0c;最多只能同时满足以下三个特性中的两个&#xff1a; 一致性&#xff08;Consistency&#xff09;&#xff1a; 所有节点在同一…

VS2022编译32位OpenCV

使用环境 Visual Studio 2022 OpenCV: 4.7.0 cmake: 3.30.2一、使用CMake工具生成vs2022的openCV工程解决方案 打开cmake&#xff0c;选择opencv的源代码目录&#xff0c;创建一个文件夹&#xff0c;作为VS工程文件的生成目录 点击configure构建项目&#xff0c;弹出构建设置…