【MyBatis】mybatis缓存机制

news2024/9/22 13:44:30

1. 缓存基础知识:

  • 缓存: cache

  • 缓存的作用: 通过减少IO的方式, 来提高程序的执行效率

  • mybatis缓存包括:

  • 一级缓存: 讲话查询的数据存储到SqlSession中

  • 二级缓存: 将查询的数据存储到SqlSessionFactory中

  • 或者集成第三方的缓存: 比如EhCache...

  • mybatis缓存只针对DQL语句, 也就是说缓存机制只对应select语句.

2. 一级缓存:

  • 一级缓存默认是开启的, 不需要做任何配置

  • 原理: 只要使用同一个SqlSession对象执行同一条SQL语句, 就会走缓存

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // mapper1和mapper2的sqlsession都是相同的, 因此会走缓存
    CarMapper mapper1 = sqlSession.getMapper(CarMapper.class);
    Car car1 = mapper1.selectById(16L);
    // 会缓存
    CarMapper mapper2 = sqlSession.getMapper(CarMapper.class);
    Car car2 = mapper2.selectById(16L);
    
    sqlSession.close();
}
  • 什么时候不走缓存?

  • SqlSession对象不是同一个, 肯定不走缓存

  • 查询条件不一样, 肯定也不走缓存

  • 什么时候一级缓存失效?

  • 第一次DQL和第二次DQL之间做了以下任意一件, 都会让一级缓存清空

  • 执行了sqlSession的clearCache()方法, 这是手动清空缓存

  • 执行了INSERT/UPDATE/DELETE语句, 不管是操作哪张表的都会清空一级缓存

3. 二级缓存:

  • 二级缓存的范围是SqlSessionFactory

  • 使用二级缓存需要具备以下几个条件

  • 全局性的开启或关闭所有映射配置文件中已配置的任何缓存, 默认就是true, 无需设置

  • 在需要使用二级缓存的SqlMapper.xml文件中添加配置:

  • 使用二级缓存的实体类对象必须是可序列化的, 也就是必须实现java.io.Serializable接口

  • SqlSession对象关闭或提交之后, 一级缓存中的数据才会被写入到二级缓存当中, 此时二级缓存才可用.

// @test
public static void main(String[] args) {

    SqlSessionFactory sqlsessionfactory = new SqlSessionFactoryBuilder().
        	build(Resources.getResourceAsStream("mybatis-config.xml"));
    
    SqlSession session1 = sqlsessionfactory.openSession();
    SqlSession session2 = sqlsessionfactory.openSession();

    CarMapper mapper1 = sqlSession1.getMapper(CarMapper.class);
    CarMapper mapper2 = sqlSession2.getMapper(CarMapper.class);
    
    // 这行代码执行结束之后, 实际上数据是缓存到一级缓存当中. (sqlSession1是一级缓存)
    Car car1 = mapper1.selectById(16L);
    System.out.println(car1);

    // 这里如果不关闭sqlSession1对象的话, 二级缓存中还是没有数据
    // 如果执行了这行代码, sqlSession1的一级缓存中的数据会放到二级缓存当中
    sqlSession1.close();
    
    // 这行代码执行结束之后, 实际上数据是缓存到一级缓存当中. (sqlSession2是一级缓存)
    Car car2 = mapper2.selectById(16L);
    System.out.println(car1);
    
    // 程序执行到这里的时候, 会将sqlSession1这个一级缓存中的数据写入到二级缓存当中
    sqlSession1.close();
    // 程序执行到这里的时候, 会将sqlSession2这个一级缓存中的数据写入到二级缓存当中
    sqlSession2.close();
}
  • 二级缓存的失效: 只需要俩次查询之间出现了增删改操作, 二级缓存就会失效(一级缓存也会失效)

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

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

相关文章

【1145. 二叉树着色游戏】

来源:力扣(LeetCode) 描述: 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不…

WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能

很多工程软件拥有自己定义的脚本语言,作为程序员用惯了具有高亮显示和智能提示功能的编辑器,所以针对特定的脚本自己开发一个编辑器。主要采用WPF、C#语言以及AvalonEdit控件。 文章目录AvlonEdit控件实现自定义高亮显示实现文本搜索实现文本替换自定义搜…

磁疗效果因“病”而异,坚持=胜利!

磁疗在我国具有悠久的历史早在春秋战国时期,就有神医扁鹊运用磁疗治病的记载。 北京军区总医院理疗科主任,中华生物磁学研究会秘书长周万松认为,关于磁场改善血液循环这一点是肯定的,磁场可以扩张血管、加速血流、改善血液循环。但…

【H5游戏】-整一个简单的解压小游戏【抽纸巾】

专栏简介 💒个人主页 📰专栏目录 点击上方查看更多内容 📖心灵鸡汤📖社会不相信庸俗,成功需要汗水和寂寞铸就。无数次的质疑或是嘲笑,这些都无所谓,记住自己是谁,自己想要什么就…

Django的信号机制解读

Django的信号 Django的信号机制不同于Linux的信号机制,Django 中的信号用于在框架执行操作时解耦。当某些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django的信号主要包含以下三个要素: 发送者(sender&#xff0…

网络隔离后的文件传输怎么解决?深度解析4种主流方案

网络隔离对于很多企业来说并不陌生,出于数据安全的考虑,为了隔离有害的网络和可能的网络攻击,越来越多的企业在内部进行了网络隔离。隔离的形态和方式有多种,总体上主要以物理隔离和逻辑隔离为主。网络隔离可以一定程度上甚至彻底…

功能测试环境搭建

前言新年好呀大家,大家都复工了吗~小编已经在搬砖中了😶在假期中小编学习了一点功能测试方面知识,打算写篇博客记录下来,希望这篇博客可以帮到需要的朋友。流程图一、测试计划测试计划需要在所有的测试工作之前进行,一…

HTTP协议(2)

1)当我们在浏览器上面输入一个搜狗搜索的网址之后,浏览器就会给搜狗的服务器发送了一个HTTP请求,这样咱们的搜狗的服务器就会返回一个HTTP响应; 2)当这个响应结果被浏览器解析之后,就展示成了我们目前所看到的页面内容&#xff0c…

20230203英语学习

What Is a Dog Anyway? 狗的争议性起源:到底怎么定义“狗” The geographer Jared Diamond has called domestication the worst mistake humans ever made. And yet, the first domestication — the turning of wolves into dogs — was an impressive feat.Hu…

java对象的比较

上一章中关于PriorityQueue的使用要注意: 1. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出 ClassCastException异常 2. 不能插入null对象,否则会抛出NullPointerException 3. 没有容量限制…

C/C++ 内存泄漏检测

C/C 内存泄漏检测内存泄漏的两个问题使用宏定义覆盖 malloc 和 free 函数使用 hook 钩子最近学习了 C/C 内存泄漏检测的相关知识,写博客记录一下。 内存泄漏的两个问题 是否有内存泄漏?内存泄漏是在代码的哪一行? 检测内存泄漏主要从上面两…

数据库系统概念 | 第十三章:事务管理 | 事务特性(ACID)| 冲突可串行化

文章目录📚事务的概念🐇事务定义🐇事务界定🐇事务特性(ACID)🐇一个简单的事务模型📚存储器结构📚事务的原子性和持久性🐇几种常见的事务状态🐇事务…

MDA260-16-ASEMI整流模块MDA260-16

编辑-Z MDA260-16在MDA封装里采用的2个芯片,是一款单臂共阳极整流模块。MDA260-16的浪涌电流Ifsm为11000A,漏电流(Ir)为15mA,其工作时耐温度范围为-40~150摄氏度。MDA260-16采用GPP硅芯片材质,里面有2颗芯片组成。MDA260-16的电性…

转行大数据开发应该怎么学习

转行进入大数据,首先需要了解的就是大数据是做什么,工作内容,然后就是找个完整的学习路线跟着去学习了,大数据的学习内容也是不少的~ 简单来说,分为6步,大数据开发入门,大数据核心基础&#xf…

【iHooya】2023年2月2日寒假作业解析

#include <bits/stdc.h> using namespace std;int main() {int n, r; //n个人&#xff0c;r个水龙头cin >> n >> r;int time[n];for (int a 0; a < n; a){cin >> time[a];}sort(time, time n); //时间从小到大排序int minx 0, lt_time[10001], j…

程序全过程:觉醒(序)

程序全过程序很惭愧&#xff0c;写了几年的程序&#xff0c;技术的功力没有太大增长&#xff0c;只是在项目的熟悉程度上有不少进步。因为上学时没好好学&#xff0c;很多现在工作中用到的编程技能都是在工作中边学边用的&#xff0c;相当于一直处于临时抱佛脚的状态&#xff0…

iptables端口复用

环境&#xff1a; 攻击主机&#xff1a;Kali -- 192.168.218.135 目标主机&#xff1a;RHEL8 -- 192.168.218.129 什么是端口复用 端口复用是指不同的应用程序使用相同端口使用相同端口进行通讯。 场景 目标主机是Linux系统&#xff0c;目标主机防火墙有严格的限制&#…

【FAQ】申请运动健康服务验证环节常见问题及解答

华为 HMS Core 运动健康服务&#xff08;HUAWEI Health Kit&#xff09;提供原子化数据开放。应用在获取用户数据授权后&#xff0c;可通过接口访问运动健康数据&#xff0c;对用户数据进行读写等操作&#xff0c;为用户提供运动健康类数据服务。 开发者应用在开发和测试阶段访…

SGI STL二级空间配置器源码剖析(2)

接着上回&#xff0c;这节开始说allocte内存分配的实现 目录 allocate源码流程&#xff1a; _S_refill 的实现&#xff1a; _S_chunk_alloc的实现&#xff1a; deallocate&#xff1a; reallocate&#xff1a; 二级空间配置器的逻辑步骤&#xff1a;假如现在申请n个字节&…

选择计算机专业,必看的10条自学建议

选择了计算机专业&#xff0c;很迷茫&#xff0c;没事&#xff01;&#xff01;博主整理了关于学习计算机的十条自学经验&#xff0c;从各个方面阐述了如何学习计算机专业。 1、学会使用Google搜索&#xff0c;放弃百度&#xff0c;你会发现Google 会搜出更多有用的答察&#x…