IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MyBatis缓存机制 -> 正文阅读

[大数据]MyBatis缓存机制

为什么使用缓存呢?

? ? ? ? 因为通过缓存机制,可以减少对数据库的查询次数,从而提高性能!

一级缓存

? ? ? ? 一句话总结,一级缓存是SqlSessio范围里的缓存,在MyBatis框架中,一级缓冲是默认开启的。

    @Test
    public void findById() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.findById(1);
        System.out.println(student);

        StudentMapper mapper2 = sqlSession.getMapper(StudentMapper.class);
        Student student2 = mapper2.findById(1);
        System.out.println(student2);

        sqlSession.close();
    }

我们来用上面的代码举个例子,通过MyBatisUtils我们获取一个SqlSession,通过这个SqlSession我们执行了俩次一模一样的查询语句,通过Log4j,我们可以看到sql语句执行的情况,如下图:

?可以很明显的发现,sql语句只执行了一次!这就是MyBatis默认开启的一级缓存。

????????那么当SqlSession关闭后,缓存就消失了,这样感觉还是很不给力啊,于是咱们就可以手动开启二级缓存,扩大缓存范围,进一步减少sql查询的次数,从而提高性能!

二级缓存

? ? ? ? 二级缓存是mapper映射级别的缓存,当多个SqlSession去操作用一个Mapper映射的sql语句时,多个SqlSession可以公用一个Mapper映射的sql语句,多个SqlSesson可以公用二级缓存,即二级缓存是跨SqlSession的。触发二级缓存的条件是,查询语句的条件相同,如果数据库的数据发生变化后,即提交了增删改方法,那么二级缓存中的数据会被清空的,图解如下:

?二级缓存机制是需要人为手动配置的,那么怎么配置呢?看如下内容!

第一步:咱们的实体类要实现Serializable接口,如下图

?第二步:在MyBatis核心配置文件中开启二级缓存

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbc.properties"/>
    
    <settings>
        <!--开启二级缓存的支持-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

注意:因为cacheEnabled的取值默认就位true,所以这一步可以省略不配置。为true代表开启二级缓存;为false代表不开启二级缓存。

第三步:在需要开启二级缓存的映射文件中使用<cache>标签,在sql语句中配置

userCache ="true"即可。

?注意:针对每次查询都需要最新的数据sql,要设置成userCache=false,禁用二级缓存。

那么接下来让我们来测试一下!

    @Test
    public void findById2() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.findById(1);
        System.out.println(student);
        sqlSession.close();


        SqlSession sqlSession2 = MybatisUtils.getSqlSession();
        StudentMapper mapper2 = sqlSession2.getMapper(StudentMapper.class);
        Student student2 = mapper2.findById(1);
        System.out.println(student2);

        sqlSession2.close();
    }

在这个测试类中,创建了2个SqlSession,执行相同的sql查询语句。查询的结果如下:

?根据Log4j产生的信息可以看到,虽然我们使用了2个SqlSession,可是Sql查询语句只执行了一次,即第二次查询的结果是在缓存中拿到的,而不是通过执行sql语句拿到的!!!

缓存失效情况

????????当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存,类似的执行了增删改,即数据库中的数据发生了改变后,二级缓存的数据也会被清空。

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:20:26  更:2021-09-13 09:21:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:48:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码