MyBatis框架一二级缓存含代码演示

news2024/11/29 12:35:43

目录

1.什么是缓存?

2. Mybatis的一级缓存

2.1实验一:

2.2实验二:

3.Mybatis的二级缓存

3.1 二级缓存需要配置才可以使用:

3.2 实验开始!!

 4.总结

1.什么是缓存?

     缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

2. Mybatis的一级缓存

     一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问。

SqlSession级别: 一个会话

作用域 : 一个SqlSession都有一级缓存,互不影响

优点 : 提高了程序性能,减少了数据库压力

实验一级缓存:定义两个会话,实验他们的作用域是不是一个会话级别是否第二次查询同样的语句会不会去缓存中找

2.1实验一:

   实验一级缓存是否会生效(一级缓存默认开启无需配置)

/**
 * 缓存测试类
 */
public class CacheTest {
    public static void main(String[] args) {
        CacheTest cacheTest=new CacheTest();
        //1.创建一个会话:默认关闭事务
        SqlSession sqlSession = MybatisUtil.getSqlSession(true);
        //2.调用查询方法
        cacheTest.getAllUser(sqlSession);
        //调用两次:实验第二次查询会不会去缓存查
        cacheTest.getAllUser(sqlSession);
        //关闭会话
        MybatisUtil.closeSqlSession(sqlSession);

    }

    /**
     * 查询用户信息
     * @param sqlSession
     */
    public void getAllUser(SqlSession sqlSession)
    {
        //获取映射文件对应的方法:查询User 列表
        List<User> allUser = sqlSession.getMapper(UserMapper.class).getAllUser();
        //打印列表
        System.out.println("id\t名称\t密码");
        for (User user : allUser) {
            System.out.println(user.getId()+"\t"+user.getName()+"\t"+user.getPassword());
        }
    }
}

实验一结果:

显而易见,一个会话中调用了两次方法,打印了两次

 方法查询了两次,通过log4j可以看出该sql语句只被执行了一次,说明第二次没有去数据库再去查找(一级缓存生效)。

2.2实验二:

  实验一级缓存的作用域(在一个SqlSession中)

/**
 * 缓存测试类
 */
public class CacheTest {


    public static void main(String[] args) {
        CacheTest cacheTest = new CacheTest();
        SqlSessionFactory build = cacheTest.getBuild();
        //创建会话1
        SqlSession sqlSession = build.openSession(false);
        System.out.println("读取会话1的数据");
        cacheTest.getAllUser(sqlSession);
        //创建会话2
        SqlSessionFactory build1 = cacheTest.getBuild();
        SqlSession sqlSession1 = build1.openSession(false);
        System.out.println("读取会话2的数据");
        cacheTest.getAllUser(sqlSession1);
        System.out.println("更新会话1的数据:");
        cacheTest.updateUser(sqlSession);
        System.out.println("读取会话1的数据");
        cacheTest.getAllUser(sqlSession);
        sqlSession.close();
        System.out.println("读取会话2的数据");
        cacheTest.getAllUser(sqlSession1);
        sqlSession1.close();


    }
}

实验二结果:

会话1没更新前,两个会话结果都是一样,同样的sql执行了两次,因为作用域不一

- 在会话1更新后,会话2的内容还是去缓存中查询的,结果不一样,而会话1在更新后,就不会再去缓存中查找。两个会话不在一个作用域中,所以更新后也不会同步到会话2

3.Mybatis的二级缓存

       二级缓存是SqlSessionFactory级别的,通过同一个SqlSessionFactory建造出来的SqlSession查询的数据会被缓存,此后如果再执行相同的查询语句,结果就会从缓存中获取。

作用域 : 整个应用中,会话共享

3.1 二级缓存需要配置才可以使用:

1.开启全局缓存

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

2.sql映射文件中设置全局配置属性:

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

3.在需要使用缓存的sql语句上设置 useCache为true:

<select id="getAllUser" resultType="user" useCache="true">
     select id,name,password from user
 </select>

3.2 实验开始!!

- 下述代码只把第二个buid删掉,共有一个即可,跟实验一的代码大同小异

    public static void main(String[] args) {
        CacheTest cacheTest = new CacheTest();
        SqlSessionFactory build = cacheTest.getBuild();
        //创建会话1
        SqlSession sqlSession = build.openSession(false);
        System.out.println("读取会话1的数据");
        cacheTest.getAllUser(sqlSession);
        //创建会话2
        SqlSession sqlSession1 = build.openSession(false);
        System.out.println("读取会话2的数据");
        cacheTest.getAllUser(sqlSession1);
        System.out.println("更新会话1的数据:");
        cacheTest.updateUser(sqlSession);
        System.out.println("读取会话1的数据");
        cacheTest.getAllUser(sqlSession);
        sqlSession.close();
        System.out.println("读取会话2的数据");
        cacheTest.getAllUser(sqlSession1);
        sqlSession1.close();
    }

- 由一个SqlSessionFactory创建出来的SqlSession之间都共享一个缓存,所以会话2也会跟着会话1所更新

 4.总结

  1. 使用Mybatis缓存也有一定的不方便性,比如当一级缓存失效后,数据不能随时更新。

  2. 实际开发中,尽量使用redis作为缓存工具,随时可以更新或者删除缓存中保存的数据

  3. 二级缓存在使用时,必须需要配置才可以使用

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

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

相关文章

学习Python中turtle模块的基本用法(2:基本绘图函数测试)

个人感觉turtle模块中的绘图函数是按人手拿着画笔一笔一画地画图的思路定义的&#xff0c;这与C#中的GDI函数、html5中canvas的绘图函数及Tkinter中Canvas的绘图函数的定义思路存在差异&#xff0c;但也能完成后面绝大部分的绘图功能&#xff08;目前看到的turtle文章及帮助文档…

安装OpenGL

提示错误信息&#xff1a; (base) C:\Users\Tina\PycharmProjects\FunnyToys-main>conda install opengl Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with flexible solve. Collecting…

python 栈空间不足异常 Process finished with exit code: -1073741571

问题现象 在pycharm使用debug模式调试代码时&#xff0c;异常退出&#xff0c;且错误码为-1073741571。除了错误码外&#xff0c;并没有看到其它报错。 分析 查阅资料&#xff1a; Process finished with exit code -1073741571 (0xC00000FD) when trying to implement ab…

AxureRP9的新特性介绍和技巧分享

AxureRP自去年8月第一个测试版本发布以来&#xff0c;已经一年多了&#xff0c;官方版本已经发布了近半年&#xff0c;但这个版本的用户声誉是褒贬不一的。许多用户反馈了他们对新版本的喜欢和肯定&#xff0c;但一些老用户仍然不愿意接受它&#xff0c;甚至保持抵制。 根据我…

【Hack The Box】linux练习-- Tabby

HTB 学习笔记 【Hack The Box】linux练习-- Tabby &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月22日&#x1f334; &#x1f36…

【数据结构】基础:二叉树

【数据结构】基础&#xff1a;二叉树基础 摘要&#xff1a;本文将会介绍二叉树的基础内容&#xff0c;首先引入树的概念&#xff0c;了解树的基本概念与性质&#xff0c;再对二叉树的概念和性质进行分析&#xff0c;最后对其方法进行实现&#xff0c;最重要的是理解对于二叉树方…

世界65个国家贸易开放度数据 2005-2019年

一、数据介绍 数据名称&#xff1a;UNtrade数据库 数据年份&#xff1a;2005-2019年 数据范围&#xff1a;世界65个国家 数据来源&#xff1a;各地方统计局 部分数据如下&#xff1a; 二、参考文献 用途&#xff1a;研究人民币实际汇率与贸易差额之间的关系等。 [1]卢向…

R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究

数据集中的Usenet公告板包括新汽车&#xff0c;体育和密码学等主题。最近我们被客户要求撰写关于主题建模的研究报告&#xff0c;包括一些图形和统计输出。我们对20个Usenet公告板的20,000条消息进行分析。 相关视频&#xff1a;文本挖掘&#xff1a;主题模型&#xff08;LDA&a…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.1 记录系统访客独立IP访问次数案例介绍

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.1 记录系统访客独立IP访问次数案例介绍2.1.1 介绍2.1.2 需求…

SpringCloud 组件Gateway服务网关【断言工厂过滤器工厂】

目录 1&#xff1a;断言工厂 2&#xff1a;过滤器工厂 2.1&#xff1a;路由过滤器的种类 2.2&#xff1a;请求头过滤器 2.3&#xff1a;默认过滤器 2.4&#xff1a;总结 1&#xff1a;断言工厂 路由断言工厂Route Predicate Factory 路由配置包括&#xff1a; 1. 路由…

C++_串口编程_官方示例:监视通信事件

这是微软官方的一个例子&#xff0c;这个例子中&#xff0c;如果不做修改&#xff0c;那么他是可以异步运行的&#xff0c;会出现一个错误&#xff1a;官方也说了一下&#xff0c;但是不太好懂&#xff0c;我拷贝过来放在这里&#xff0c;作为参考。 如果无法立即完成重叠的操作…

1_MyBatis入门

原生JDBC实现CURD的问题 1 编码繁琐 2 需要我们自己将结果集映射成对象 3 性能不太好 连接池 缓存 4 SQL语句和java代码的耦合度特别高 5 … … MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code&#xff0c;且改名为…

python学习笔记(10)

目录 第八章 函数 1.模块化程序设计&#xff08;模块化---封装、复用、可替代&#xff09; 2.定义函数 3.函数调用 4.return语句 5.函数参数 6.变量作用域 7.函数的递归调用 8.匿名函数 9.迭代器 10.生成器 11.装饰器 第八章 函数 1.模块化程序设计&#xff08;…

【线性表】—不带头单向非循环链表的增删查改

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)

事件起因&#xff1a;周六晚上&#xff0c;看法国对丹麦世界杯&#xff0c;突然网页浏览器无法工作。 1.然后尝试修改dns路由修改为114.114.114.114&#xff0c;又还原system32/driver/hosts仍然无法使用 2.查看是否有浏览器代理&#xff0c;查询无 3.查看是否有可疑进程&…

游戏开发24课 cocoscreator scrollview优化

分享一个 ScrollView 优化组件 增加一个 在线演示地址 显得高大上一点 image.png32762116 263 KB 目前支持的功能 水平/垂直滑动 可变尺寸动态更新 平滑滚动到底部 Grid 正序排列、倒序排列 无限循环滚动 单向、双向 下拉刷新 &#xff08;只是这么叫 实际上就是两种类型…

深度学习第四课——卷积神经网络(week 2)

目录 二、深度卷积网路 2.1 经典网络结构 2.1.1 LeNet - 5 2.1.2 AlexNet 2.1.3 VGG - 16 2.2 残差网络&#xff08;ResNets - Residual Networks&#xff09; 2.3 残差网络为什么有用 2.4 网络中的网络及11卷积 2.5 Inception网络 2.5.1 介绍 2.5.2 应用 2.6 使用…

24. [Python GUI] PyQt5中的模型与视图框架-表格部件QTableWidget

PyQt5的表格部件QTableWidget QTableWidget 类继承自 QTableView&#xff0c;该类是一个由 Qt 实现的标准的表格部件&#xff0c;该类的数据项由 QTableWidgetItem 类管理。 当前单元格(或当前项目)与当前索引或当前选择是相同的&#xff0c;即可以同时选择多个单元格&#x…

Spark 3.0 - 7.LR 多分类实现影评预测电影评分与指标评测

目录 一.引言 二.LR 多分类分析 三.LR 多分类实战 1.数据准备 Comment -> RDD -> DF 2.数据处理 JieBaTokenizer -> HashingVector 3.模型训练 LR 4.模型评估 Metrics 5.人工校验 DIY 四.总结 一.引言 Spark 3.0 - 5.ML Pipeline 实战之电影影评情感分析 通…

浅析数据采集工具Flume

title: Flume系列 第一章 Flume基础理论 1.1 数据收集工具产生背景 Hadoop 业务的一般整体开发流程&#xff1a; 任何完整的大数据平台&#xff0c;一般都会包括以下的基本处理过程&#xff1a; 数据采集 数据 ETL 数据存储 数据计算/分析 数据展现 其中&#xff0c;数据…