首页 > 其他分享 >mybatis一级缓存机制

mybatis一级缓存机制

时间:2024-09-20 18:51:06浏览次数:3  
标签:缓存 一级 数据库 默认 mybatis 数据

在mybatis中一级缓存是默认打开的,二级缓存没有默认打开,需要主动配置。今天我们主要来说一级缓存的执行机制。

 

首先,我们应该了解为什么有缓存

如果没有缓存,那么java程序每次去数据库取数据的时候,都会直接去数据库取,如果取的是相同的数据,会大大影响效率,因为与数据库的链接本质就是网络链接,其中会有三次握手,网络较差等原因。这时,如果存在缓存,就会把取到的数据放到缓存中,在再次取出数据的时候就能直接去缓存中读取,避免直接操作数据库影响效率。

 

基本说明:

1、默认情况下,mybatis是启用一级缓存(本地缓存)的,它是sqlsession级别的,及随着会话关闭而关闭

2、同一个sqlsession接口对象调用了相同的select语句,会直接从缓存里面获取,而不是再去查询数据库

●一级缓存原理图

6443a0acea044bcab933d8ce20f30ac9.png 执行流程

首先,用户发送请求, mybatis就会得到他的sqlsession对象(可以理解成数据库的链接),然后调用在默认的DefaultSqlSession中的selectone方法中的selectList方法,默认情况下走的executor是CacheExecutor(补充说明:executor有许多种类),这是会执行一个query方法到二级缓存,但是前面说过二级缓存需要配置,所以他是空的,然后就会到本地缓存,如果也为空,这时就会调用doQuery方法去真正到数据库查询,然后得到数据,然后直接remove掉key为你参数的那条数据,然后重新放进去。注意:java只要到数据库去查了一次,在默认情况下他就一定会把查到的东西往你的一级缓存中重新放一次,相当于替换,因为他担心你的数据没有同步!所以不管你是否查询成功,他都会将其删掉。这时如果成功他才真正将数据放到一级缓存。此时再去重新查询,就会去一级缓存中取值。

其中的key是经过处理的,如果你传入是id号,他并不是简单的你传入的那个数,而是其底层将其转换为一个复杂的值,避免key重复

标签:缓存,一级,数据库,默认,mybatis,数据
From: https://blog.csdn.net/2401_83324467/article/details/142392133

相关文章

  • 2024-09-20 如何去除vue前端框架upload组件中的缓存 ==》v-if+setTimeout
    在很多前端框架中的upload组件,比如arco-design的a-upload组件,在遍历渲染过程中会发现上传完成后,切换到另一个a-upload组件,它的图片会显示上一个a-upload组件的缓存 正常上传,然后点击红色,红色对应的图片应该被清空,实际上却并没有,如下解决方案:给a-upload组件加一个条件判断v-if......
  • 缓存
    Django4中的缓存详细文档参考:https://www.cnblogs.com/Neeo/articles/17589834.htmlDjango支持的缓存有好几种:三方的Redis(推荐),Memcached(不推荐)缓存到本地文件缓存到本地数据库缓存到内存里虚拟缓存缓存的粒度局部视图缓存缓存指定的视图函数,有两种写法.在视图......
  • 如何通过调整RecyclerView的缓存来优化滚动性能
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在RecyclerView中,setMaxRecycledViews方法用于设置RecycledViewPool的缓存大小,这是一个重要的性能优化手段。RecycledViewPool允许多个RecyclerView实例共......
  • Mybatis-plus复习篇--加油
    文章目录1.MyBatis-plus基础1.1.mybatis-plus简介1.2.基本使用1.3.注解映射主键生成策略1.4.命名转换问题1.5.关闭命名转换功能2.BaseMapper核心接口1.MyBatis-plus基础1.1.mybatis-plus简介MyBatis-Plus(简称MP)是一个 MyBatis的增强工具,在MyBatis的基础上只做增强不......
  • Mybatis续
    步骤爆红点了右上角还是爆红不要着急,右下角正在下载new如果new的是package,用com.zhang,能事项分级如果new的是文件夹,用com/zhang,就能实现分级。如果用com.zhang,则创建的文件夹名是com.zhang,而不是分级的形式步骤修改为自己的记不住就把之前jdbc的复制过来问题......
  • MyBatis中一对多关系的两种处理方法
    目录1.多表联查(通过collection标签的ofType属性)1)mapper2)mapper.xml3)测试代码4)测试结果2.分布查询(通过collection标签的select属性)1)mapper2)mapper.xml3)测试代码4)测试结果附录1.Classes实体类2.student类3.OneToManyMapper4.OneToManyMapper.xml5.OneToManyM......
  • 2025秋招LLM大模型多模态面试题(六)-KV缓存
    目录为什么Transformer推理需要KV缓存?KV缓存的具体实现没有缓存的情况下使用缓存的情况下KV缓存在解码中的阶段划分Prefil阶段Decoding阶段KV缓存的存储类型及显存占用计算KV缓存的局限与优化策略超长文本与复杂模型场景下的瓶颈量化方案的应用量化方......
  • Spring Boot 整合 MyBatis 的详细步骤(两种方式)
    1.SpringBoot配置MyBatis的详细步骤1、首先,我们创建相关测试的数据库,数据表。如下:CREATEDATABASE`springboot_mybatis`USE`springboot_mybatis`CREATETABLE`monster`(`id`intnotnullauto_increment,`age`intnotnull,`birthday`DATEDEFAULTN......
  • mybatis的代理技术
    在MyBatis中,代理对象是通过动态代理技术生成的对象,用于拦截对接口方法的调用并将这些调用转发给相应的SQL映射文件中的SQL语句执行。具体来说,代理对象是一个实现了某个接口的类实例,但这个实例的实际行为是在运行时动态生成的,而不是在编译时固定的。###动态代理在Java中......
  • 146. LRU 缓存
     \classLRUCache{public:LRUCache(intcapacity):_capacity(capacity){}intget(intkey){autoit=_unorderedMap.find(key);if(it!=_unorderedMap.end()){_list.splice(_list.begin(),_list,it->se......