java—Mybatis缓存

news2024/12/25 22:09:31

缓存的作用

缓存(cache)的作用是为了减轻数据库的压力,提高查询性能。

为什么使用缓存

        mysql数据库保存的数据均在硬盘中,CPU是不会直接和硬盘进行交互的,因为硬盘的数据传输率很低,而CPU的数据传输率很高, CPU和内存直接进行交互,内存的数据传输速率更快。例如,在短时间内,当需要对数据库进行多次同一访问操作时,整个过程中就需要多次获取存储在硬盘中数据,由上文可知,获取硬盘的数据速度较慢,我们可以将第一次访问后得到的数据放入缓存(cache)中,缓存是在内存当中,下一次访问时直接从缓存中获取,也就是从内存中获取,而不是硬盘中。从而减少了对数据库的查询次数,因此提高了数据库的性能。

一级缓存和二级缓存

一级缓存

一级缓存作用域是同一个SqlSession对象,即一次sql会话,在一个sql会话中执行多次相同的sql语句,第一次执行完毕后会将数据库中查询到的数据放入到缓存中,在本次sql会话中执行重复的sql操作,会直接从缓存中获取数据。
    由于SqlSession对象在每次执行完毕后都会关闭,所以一级缓存并无实际意义。


代码示例:

import com.flash.mybatis.dao.StudentDao;
import com.flash.mybatis.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

/**
 * @author flash
 * @date 2024/06/22 9:51
 * 功能描述:mybatis一级缓存
 */
public class Test {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.sqlSessionFactory.openSession();
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
        studentDao.findStudentById(1);
        studentDao.findStudentById(1);
        sqlSession.close();
    }
}

运行结果:

   

清空一级缓存

方法①:执行增、删、改操作
方法②:调用SqlSession对象的clearCache()方法
方法③:关闭本次sql会话,即执行SqlSession对象的close()方法

代码示例:

import com.flash.mybatis.dao.StudentDao;
import com.flash.mybatis.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

/**
 * @author flash
 * @date 2024/06/22 9:51
 * 功能描述:mybatis一级缓存
 */
public class Test {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.sqlSessionFactory.openSession();
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
        // mybatis 提供的缓存功能
        // 一级缓存, 作用不太大
        // 同一个 sqlSession 会话中相同的查询语句, 只执行一次, 然后将数据放入缓存中
        // 下次再取时直接从 sqlSession 缓存中获取
        studentDao.findStudentById(1);
        // 方法1.中间如果含有增删改操作, 则会清空一级缓存数据
        // studentDao.deleteStudentById(1);
        // 方法2.或强制清空一级缓存
        sqlSession.clearCache();
        studentDao.findStudentById(1);
        // 方法3.关闭sql会话清空当前 sqlSession 一级缓存
        sqlSession.close();
    }
}

执行结果:

由运行结果可知,执行了两次sql语句

二级缓存

二级缓存是多个SqlSession对象所共享的,作用域是同一个SqlSessionFactory对象,短时间内不同的sql会话中执行相同的sql语句,除第一次外可以直接从缓存中获取数据。Mybatis中默认没有开启缓存开启二级缓存,需要在Mybatis的配置文件中在<setting>标签中设置全局参数开启二级缓存。

mybatis配置文件设置如图所示

映射文件设置cache属性如图所示

使用cache的类需要实现Serializable接口,定义serialVersionUID
代码示例:

import com.flash.mybatis.dao.StudentDao;
import com.flash.mybatis.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

/**
 * @author flash
 * @date 2024/06/22 10:39
 * 功能描述:mybatis提供的二级缓存
 */
public class Test {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.sqlSessionFactory.openSession();
        // sqlSessionFactory 对象只有一个, 创建后不关闭, 多个 sqlSession
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
        studentDao.findStudentById(1);
        sqlSession.close();

        SqlSession sqlSession2 = MybatisUtil.sqlSessionFactory.openSession();
        // 此处可以打断点, 缓存刷新设置的是 3s, debug停在断点处 3s 过后就会第二次重复查询, 因为缓冲区上一次放入的数据已经被清空
        StudentDao studentDao2 = sqlSession2.getMapper(StudentDao.class);
        studentDao2.findStudentById(1);
        sqlSession2.close();
    }
}

运行结果:

Mybatis官方提供文档

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

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

相关文章

Android获取控件宽高的几种方式

第一种方式&#xff1a;在需要时获取&#xff0c;如控件点击时再获取 button.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { getTextWidthAndHeight(); } }); 第二种方式&#xff1a;重写onWindowFocusChanged()方法 Overr…

创建npm私包

参考文章&#xff1a; 使用双重身份验证访问 npm | npm 中文网 私有npm包的实例详解-js教程-PHP中文网 1.注册npm账号 npm官网&#xff1a; npm | Home 2.安装node 百度挺多的&#xff0c;安装完后&#xff0c;检查是否安装成功就行 3.写一个简单的模块 创建个文件夹&am…

51学习记录(一)——51介绍及震动感应灯

文章目录 前言一、STC89C522.内部结构及引脚 二、继电器原理及震动传感器原理三、项目搭建及实现 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、STC89C52 1.简介 所属系列&#xff1a;51单…

KIVY BLOG Kivy tutorial 007: Introducing kv language

Kivy tutorial 007: Introducing kv language – Kivy Blog DECEMBER 18, 2019 BY ALEXANDER TAYLOR Kivy tutorial 007: Introducing kv language Kivy 导师课007&#xff1a; 介绍kv语言 Central themes: kv language, building a gui, integration with Python 中心主题:…

qt 简单实验 一个可以向左侧拖拽缩放的矩形

1.概要 向左拖拽矩形&#xff0c;和向右拖拽不同&#xff0c;向右拖拽是增加宽度&#xff0c;向左拖拽是增加宽度的同时还要向左移动x的坐标。 2.代码 2.1 resizablerectangleleft.h #ifndef RESIZABLERECTANGLELEFT_H #define RESIZABLERECTANGLELEFT_H #include <QWid…

win10系统还原怎么操作?超实用的四个系统一键重装方法来了

在我们使用电脑的日常生活中&#xff0c;Win10系统可能会出现各种问题&#xff0c;比如系统运行缓慢、程序崩溃或者遭受了恶意软件的攻击。为了解决这些问题&#xff0c;系统还原是一种非常有效的方法&#xff0c;能够让您快速地将系统恢复到之前的正常状态。而如今&#xff0c…

[保姆级教程]uniapp自定义标签页切换组件

文章目录 导文样式改成动态列表切换点击效果加上点击自动滑动scroll-view加上切换组件效果 导文 unaipp自带的标签页和ui设计相差太大&#xff0c;直接修改组件比手写一个还麻烦&#xff0c;下面手写一个。 样式 先用scroll-view做一个滑动&#xff0c;不然多的话滑动不了。 &l…

共93本!全网最全Frontiers旗下期刊2022、2023版影响因子和分区对比完整版目录!

本周投稿推荐 SSCI • 1区&#xff0c;4.0-5.0&#xff08;无需返修&#xff0c;提交可录&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.1-0.5&…

Android jetpack Room的简单使用

文章目录 项目添加ksp插件添加 room 引用开始使用room1. 创建bean2. 创建 dao类3. 创建database类 数据库升级复制数据库到指定路径参考文献 项目添加ksp插件 注意&#xff0c;因为ksp插件 是跟项目中使用的kotlin的版本要保持一致的&#xff0c;否则会报错的 首先我们去 https…

HTML静态网页成品作业(HTML+CSS)——家乡泉州介绍网页(3个页面)(表格布局)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;table布局&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。…

Vue75-路由传参3

一、在index.js中使用props参数 1-1、写法一&#xff1a;值为对象 此时&#xff0c;参数是固定写死的&#xff0c;不推荐&#xff01; 1-2、值为布尔值 此时只能收到params中的参数&#xff01; 1-3、值为函数 &#xff08;最强大&#xff09; 二、小结

什么是新媒体矩阵?如何搭建?

什么是新媒体&#xff1f; 新媒体矩阵作用 新媒体矩阵账号类型 搭建新媒体矩阵步骤

Autosar Dcm配置-0x23服务ReadMemoryByAddress-基于ETAS软件

文章目录 前言Dcm配置DcmDsdDcmDspDcmDspMemoryIdInfo 代码分析总结 前言 一般在调教开发阶段&#xff0c;会使用XCP进行观测和标定&#xff0c;本质上也是操作指定的内存地址。量产后&#xff0c;一般XCP会取消。本文介绍的UDS ReadMemoryByAddress服务&#xff0c;也是读取内…

第9章 项目管理概论 (项目管理原则)

第9章 项目管理概论 9.7项目管理原则&#xff0c;在第三版教材第344~349页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;根据环境进行裁剪 (关注的)关键点 每个项目都具有独特性 项目成功取决于适合项目的独特环境和方法 裁剪应该在整个项目进展过程中持续进行第二…

AUCell和AddModuleScore函数进行基因集评分

AUCell 和AddModuleScore 分析是两种主流的用于单细胞RNA测序数据的基因集活性分析的方法。这些基因集可以来自文献、数据库或者根据具体研究问题进行自行定义。 AUCell分析原理&#xff1a; 1、AUCell分析可以将细胞中的所有基因按表达量进行排序&#xff0c;生成一个基因排…

atcoder abc 358

A welcome to AtCoder Land 题目&#xff1a; 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {string a, b;cin >> a >> b;if(a "AtCoder" && b "Land") cout <&…

车辆轨迹预测系列 (三):nuScenes数据集详细介绍-1

车辆轨迹预测系列 (三)&#xff1a;nuScenes数据集详细介绍-1 文章目录 车辆轨迹预测系列 (三)&#xff1a;nuScenes数据集详细介绍-1一、数据集准备1、解压2、安装nuscenes-devkit3、介绍 二、架构内容解释1、category 类别2、attribute 属性3、visibility 可见性4、instance …

【金】01Y120 pygame 外星人入侵

13241890059 具有功能&#xff1a;分数记录、排行榜、难度升级 ‪H:\0work\1_pygame-200

emWin在Windows上仿真运行环境配置

文章目录 一、emWin介绍二、emWin必用的2个工具2.1 PC仿真器2.2 GUIBuilder图形化设计工具三、安装VS2022四、打开emwin仿真工程五、常见的配置修改5.1 运行内存修改5.2 LCD显示屏尺寸的修改一、emWin介绍 emWin(Embedded Wizard Graphics Library)是Segger公司开发的嵌入式…

Redis实战—Redis分布式锁

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于Redis的分布式锁 Redis锁代码实现 修改业务代码 分布式锁误删问题 分布式锁原子性问题 Lua脚本 编写脚本 代码优化 总结 分布式锁介绍…