java—Mybatis缓存

缓存的作用

缓存(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 对象只有一个, 创建后不关闭, 多个 sqlSessionStudentDao 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.mzph.cn/bicheng/32385.shtml

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

相关文章

VBA技术资料MF165:关闭当前打开的所有工作簿

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

springBoot不同module之间互相依赖

在 Spring Boot 多模块项目中&#xff0c;不同模块之间的依赖通常是通过 Maven 或 Gradle 来管理的。以下是一个示例结构和如何设置这些依赖的示例。 项目结构 假设我们有一个多模块的 Spring Boot 项目&#xff0c;结构如下&#xff1a; my-springboot-project │ ├── p…

「前端+鸿蒙」鸿蒙应用开发-UI组件

在鸿蒙应用开发中,UI组件是构建用户界面的基本元素。以下是一些常用UI组件的介绍,包括它们的使用方式和示例代码。 1. 文本(Text) 文本组件用于在界面上显示文本内容。 import {Component, render, Text } from @ohos/arkui;class TextComponent extends Component {rend…

Spring (75)Spring Boot的部署最佳实践

在部署Spring Boot应用程序时&#xff0c;最佳实践通常涉及应用程序的打包、配置管理、健康检查、日志记录、安全、环境隔离和监控。以下是结合一些最佳实践的详细步骤和解释。 1. 打包和构建 Spring Boot应用程序通常打包为可执行的JAR文件&#xff0c;它包括应用程序和所有…

四年Android,终于咸鱼翻身!8K到25K全靠这份高级面试题+解析!

1、哪些情况下的对象会被垃圾回收机制处理掉&#xff1f; 2、讲一下常见编码方式&#xff1f; 3、utf-8 编码中的中文占几个字节&#xff1b;int 型几个字节&#xff1f; 4、静态代理和动态代理的区别&#xff0c;什么场景使用&#xff1f; 5、Java 的异常体系 6、谈谈你对解析…

写一个坏越的个人天地(一)

好久没写什么大点的项目了,今天想着写一个个人博客好了。I did it! 做个人天地。肯定得有个主题色吧。整个下拉界面,先准备三个色系吧 <el-header class="title"><el-dropdown @command="handleCommand"><span class="el-dropdown-…

若依4.7.8版本计划任务rce复现

0x00 背景 最近项目中发现很多单位都使用了若依二开的系统&#xff0c;而最近若依有个后台计划任务rce的漏洞&#xff0c;比较新&#xff0c;我还没复现过&#xff0c;于是本地搭建一个若依环境复现一下这个漏洞。 这个漏洞在4.7.8版本及之前都存在&#xff0c;现在最新版的若…

管理端开发如何快速理解并实现权限控制总结

管理端开发如何快速理解并实现权限控制总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在管理端开发中&#xff0c;权限控制是至关重要的一环。通过权限控…

647. 回文子串(leetcode)

647. 回文子串&#xff08;leetcode&#xff09; 题目描述 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中回文子串的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例1 输入&#xff1a;s “abc” 输出…

Golang | Leetcode Golang题解之第179题最大数

题目&#xff1a; 题解&#xff1a; func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y : nums[i], nums[j]sx, sy : 10, 10for sx < x {sx * 10}for sy < y {sy * 10}return sy*xy > sx*yx})if nums[0] 0 {return "0"…

Android 天气APP(八)城市切换 之 自定义弹窗与使用

然后在模块的utils包中新建一个LiWindow类 代码如下&#xff1a; package com.llw.mvplibrary.utils; import android.app.Activity; import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; im…

element-ui里message抖动问题

由于element默认屏蔽滚动条&#xff0c;导致取消时弹message时 侧边滚动栏突然回来后引起抖动问题 是由于打开弹窗时出现遮罩层dialog对话框 时引起了元素内容超出自身尺寸 对应的overflow样式内容为hidden&#xff0c;且新建了一个class类内容为增加17 内右边距&#xff0c;当…

某md5魔改-js还原

我们先把js 扣下来看一下 整体扣一下 ,运行后发现结果一致。 到这里就结束了吗,不不,这次我们要看到它里面具体的变动 <-_-> 先看一下md5的初步加密流程 void MD5Init(MD5_CTX *context) {context->count[0] = 0;context->count[1] = 0;context->state[0]…

注解详解系列 - @Order:控制Bean加载顺序

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨Order注解。Order是Spring框架中的一个重要注解&#xff0c;用于控制Spring容器中Bean的加载顺序。通过Order注解&#xff0c;可以指定多个Bean的优先级&#xff0c;从而决定它们的执行或加载顺序。 注解定义 Order注解…

AI网络爬虫:搜狗图片的时间戳反爬虫应对策略

如何批量爬取下载搜狗图片搜索结果页面的图片&#xff1f;以孙允珠这个关键词的搜索结果为例&#xff1a; https://pic.sogou.com/pics?query%E5%AD%99%E5%85%81%E7%8F%A0&mode2 翻页规律如下&#xff1a; https://pic.sogou.com/napi/pc/searchList?mode2&start38…

目标检测YOLO实战应用案例100讲-【目标检测】YOLOV9

目录 前言 算法原理 Methodology—方法 可编程梯度信息PGI 辅助可逆分支 多级辅助信息 广义 ELAN 实验效果 实施细节 与最先进实时目标检测器的比较 消融实验 表6展示了从基线 YOLOv7 到 YOLOv9 逐渐增加组件的结果。我们提出的 GELAN 和 PGI 为我们带来了较大优势…

Flutter开发环境搭建和调试

[你的Flutter文件夹路径]\flutter\bin 这样我们的Flutter SDK的环境变量就配置完毕了。接下来在命令提示符窗口中输入命令&#xff1a; flutter doctor 它可以帮助我们检查Flutter环境变量是否设置成功&#xff0c;Android SDK是否下载以及配置好环境变量等等。如果有相关的…

【接口自动化测试】第二节.Requests库和接口对象封装

文章目录 前言一、Requests库 1.1 Requests介绍 1.2 Requests发送请求 1.3 Requests查看响应 1.4 案例1登录接口调试-获取验证码 1.5 案例2登录接口调试-登录 1.6 归纳小结二、接口对象封装 2.1 当前代码待优化问题 2.2 接口对象封装思…

仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮

, mWidth - mCircleWidth, mHeight - mCircleWidth); canvas.drawRoundRect(rectF, mHintBgRoundValue, mHintBgRoundValue, mHintPaint); //前景文字 mHintPaint.setColor(mHintFgColor); // 计算Baseline绘制的起点X轴坐标 int baseX (int) (mWidth / 2 - mHintPaint.m…

JS中正则表达式的语法与使用案例

JavaScript 中的正则表达式&#xff08;Regular Expressions&#xff0c;简称 RegEx&#xff09;是一种描述字符模式的对象&#xff0c;用于在字符串中进行模式匹配和替换操作。正则表达式在很多编程语言中都有广泛应用&#xff0c;而在 JavaScript 中&#xff0c;正则表达式主…