MyBatis框架一二级缓存含代码演示
创始人
2024-02-21 15:36:41
0

目录

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 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();//创建会话1SqlSession sqlSession = build.openSession(false);System.out.println("读取会话1的数据");cacheTest.getAllUser(sqlSession);//创建会话2SqlSessionFactory 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.开启全局缓存

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

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

3.2 实验开始!!

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

    public static void main(String[] args) {CacheTest cacheTest = new CacheTest();SqlSessionFactory build = cacheTest.getBuild();//创建会话1SqlSession sqlSession = build.openSession(false);System.out.println("读取会话1的数据");cacheTest.getAllUser(sqlSession);//创建会话2SqlSession 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. 二级缓存在使用时,必须需要配置才可以使用

上一篇:day02 linux常用命令

下一篇:SQL练习题

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...