当前位置: 首页 > news >正文

Mybatis框架的缓存

Mybatis框架的缓存

一.为什么使用缓存

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

二.缓存类型

Mybatis 有一级缓存和二级缓存。一级缓存的作用域是同一个SqlSession, 在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库 中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查 询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存 也就不存在了。Mybatis默认开启一级缓存。 二级缓存是多个SqlSession共享的,其作用域是同一个namespace,不同的 sqlSession 两次执行相同namespace下的sql语句且向sql中传递参数也相同 即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存 (内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。 Mybatis 默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。

三.缓存的使用

1.一级缓存:

Mybatis 对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓 存,一级缓存只是相对于同一个SqlSession而言。 所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调 用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询 后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新, 并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再 次发送SQL到数据库。

工作模式:
在这里插入图片描述

2.二级缓存:

二级缓存是SqlSessionFactory级别的,根据mapper的namespace划分 区域的,相同namespace的mapper查询的数据缓存在同一个区域,如果使 用mapper代理方法每个mapper的namespace都不同,此时可以理解为二 级缓存区域是根据mapper划分。 每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数 据写入缓存。Mybatis内部存储缓存使用一个HashMap,key为 hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的java对象。 sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区 域,防止脏读。

二级缓存工作模式:
在这里插入图片描述

配置二级缓存配置:

第一步:启用二级缓存 在SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当 cacheEnabled 设置为true时启用二级缓存,设置为false时禁用二级缓存。 第二步:对象序列化 将所有的POJO类实现序列化接口Java.io.Serializable。 第三步:配置映射文件 在Mapper映射文件中添加,表示此mapper开启二级缓存。 当SqlSeesion 关闭时,会将数据存入到二级缓存.

Mybatis:

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

Mapper:

        <!--设置二级缓存配置的size=""缓存对象数量flushInterval=""设置二级缓存有效时间   毫秒单位eviction="FIFO"  firstinfirstout先入先出 配置到期后淘汰策略--><cache size="20" flushInterval="3000"></cache>

四.Mybatis架构:
在这里插入图片描述

相关文章:

  • Excel导出实例
  • rust内存分配,内存回收,内存泄露
  • 联华集团:IT团队如何实现从成本中心提升至价值中心|OceanBase 《DB大咖说》(十)
  • (三十)Flask之wtforms库【剖析源码上篇】
  • 动态规划02(Leetcode62、63、343、96)
  • C语言——文件
  • Elastic字段映射(_source,doc_value,fileddata,index,store)
  • 【C语言】解决C语言报错:Array Index Out of Bounds
  • EasyExcel自定义处理器扩展指定行修改样式包括字体颜色
  • 没等来百度惊艳的All in AI,却等来了国产之光的盘古大模型 5.0
  • java-正则表达式 1
  • Android使用MPAndroidChart 绘制折线图
  • Java学习 - MySQL存储过程、函数和触发器练习实例
  • Java中的设计模式:实战案例分享
  • labelme使用笔记:目标检测数据集标注和语义分割数据集批量生成
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CentOS 7 防火墙操作
  • codis proxy处理流程
  • CSS实用技巧干货
  • DataBase in Android
  • JAVA 学习IO流
  • javascript从右向左截取指定位数字符的3种方法
  • javascript面向对象之创建对象
  • Mocha测试初探
  • react-native 安卓真机环境搭建
  • SpiderData 2019年2月13日 DApp数据排行榜
  • spring学习第二天
  • vue-cli在webpack的配置文件探究
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 前言-如何学习区块链
  • 悄悄地说一个bug
  • 王永庆:技术创新改变教育未来
  • 温故知新之javascript面向对象
  • 应用生命周期终极 DevOps 工具包
  • python最赚钱的4个方向,你最心动的是哪个?
  • 正则表达式-基础知识Review
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • ###C语言程序设计-----C语言学习(3)#
  • #ubuntu# #git# repository git config --global --add safe.directory
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (12)Linux 常见的三种进程状态
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (39)STM32——FLASH闪存
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)球球大作战
  • (Git) gitignore基础使用
  • (Java)【深基9.例1】选举学生会
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (windows2012共享文件夹和防火墙设置
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)SSM环卫人员管理平台 计算机毕设36412