Mybatis的缓存

news/2024/4/28 3:59:45/文章来源:https://www.cnblogs.com/tianaqiang/p/16608199.html

1. Mybatis的一级缓存

Mybatis的一级缓存是默认开启的,你只要搭建一个Mybatis框架,就可以直接使用一级缓存。

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

条件:

  1. 同一个SqlSession
  2. 查询相同的数据

例子:

  • 同一个SqlSession查询相同的数据

    这里我们通过员工id查询员工信息,且两次都是查询 id=1 的员工

    image-20220820160617202

    通过下面的日志信息可以看到,只执行了一次sql语句,但查询出了两次员工信息。

    所以说第一次是从数据库中查询,第二次是从缓存中查询到的。

    image-20220820161010351
  • 不同SqlSession查询相同的数据

    image-20220820161856061 image-20220820162059689

使一级缓存失效(满足2个条件,但不从缓存中找)的2种情况:

  1. 同一个SqlSession两次查询期间执行了任何一次增删改操作

  2. 同一个SqlSession两次查询期间手动清空了缓存

    sqlSession.clearCache();
    

2. Mybatis的二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。

二级缓存的范围更大,需要手动开启。

二级缓存开启的条件:

  1. 在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,所以不需要自己设置

  2. 在Mybatis映射文件中设置标签:

    image-20220820163532453
  3. 二级缓存必须在SqlSession关闭或提交之后有效

    image-20220820164127714 image-20220820164551232

    原因:第一次查询数据只保存在一级缓存中,只有在SqlSession操作完毕(关闭或提交)后,一级缓存中的数据才保存到二级缓存中。

    image-20220820165435667

    这时候运行代码会报一个没有序列化的异常:

    image-20220820165625786
  4. 查询的数据所转换的实体类类型必须实现序列化的接口

    image-20220820165720034

二级缓存失效的情况:

  • 两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

3. 二级缓存的相关配置

在mapper配置文件中添加的cache标签可以设置一些属性:

  • eviction属性:缓存回收策略,默认的是 LRU。

    • LRU(Least Recently Used):最近最少使用的:移除最长时间不被使用的对象。
    • FIFO(First in First out):先进先出:按对象进入缓存的顺序来移除它们。
    • SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
    • WEAK : 弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象
  • flushInterval属性:刷新间隔,单位毫秒
    默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

  • size属性:引用数目,正整数,一般不去设置它,用默认的就行
    代表缓存最多可以存储多少个对象,太大容易导致内存溢出

  • readOnly属性:只读, true/false

    • true:只读缓存;会给所有调用者返回缓存对象的相同实例,这些对象不能被修改。这提供了 很重要的性能优势。
    • false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

4. MyBatis缓存查询的顺序

  1. 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

  2. 如果二级缓存没有命中,再查询一级缓存

    有小伙伴可能就要说了,二级缓存的范围更大,二级中包括了一级,二级中都没有,一级中肯定也没有啊???

    不一定,一级缓存只有关闭或提交后才保存到二级缓存,所以二级缓存中可能也没有某些一级缓存。

  3. 如果一级缓存也没有命中,则查询数据库

5. 总结

部分内容来自 B站尚硅谷课程 。老师讲得很好,有兴趣的可以听听。

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

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

相关文章

2022年多校冲刺NOIP联训测试13 51nod2023省选联训 第三场

A 隔离 二分答案,简单\(check\)一下即可code #include<cstring> #include<algorithm> #include<cstdio> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<random>using na…

低风险稳健策略:BTC套利策略

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 币安零手续费带来的机会 从7月8日的20点开始,币安推出了BTC现货交易零手续费的优惠活动,不论是Maker还是Taker都不收取手续费。此次活动包括了交易量最大的BTC/USDT和BTC/BUSD。BT…

适用于ps的Raw格式图像插件

Adobe Camera Raw14 中文版是适用于ps的Raw格式图像插件,安装上Camera Raw插件能在PS中打开编辑RAW格式文件,可以说是专业摄影师必备工具。目前Adobe Camera Raw中文版已经支持大部分主流相机,可以让用户在PS中处理各种形态的RAW文件。 软件下载地址 Camera Raw 软件是作为一…

AJAX概念和AJAX实现_原生JS方式

AJAX概念:概念:ASynchronous JavaScript And XML 异步的JavaScript和XML AJAX是一种在无需重新加载整个网页的情况下能够更新部分网页的技术。通过在后台于服务器进行少量数据叫唤,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进…

RadioGroup+RadioButton进行美化,以替换之前的选择状态

效果图: 1、进行样式定义 radio_sel_state:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="false"android:drawab…

Hadoop常见的文件格式及压缩算法

前言该文章中将会整理一些大数据中常见的文件格式及压缩算法的理论知识,作为后期实践的理论指导。理论+实践才会更方便用这些文件格式和压缩算法。 目前hadoop中常见的文件格式有textfile、sequencefile、avro、rcfile、orcfile、parquet等,上述六种文件格式又可以划分为行…

Vue3 + Socket.io + Knex + TypeScript 实现可以私聊的聊天室

前言 下文只在介绍实现的核心代码,没有涉及到具体的实现细节,如果感兴趣可以往下看,在文章最后贴上了仓库地址。项目采用前后端模式,前端使用 Vite + Vue3 + TS;后端使用 Knex + Express + TS。目前项目还没有完全实现,文章的目的是记录阶段性“胜利”和分享知识。 关于搭…

Docker入门-基础知识

Docker入门-基础知识 Cloud研习社 Cloud研习社 2022-06-17 07:26 发表于山东收录于合集#实战经验33个 #云计算34个 #计算机37个 #docker3个 #IT23个 Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,以便您可以快速交付软件。…

AJAX概念和AJAX实现原生JS方式

AJAX概念 概念:ASynchronous JavaScript And XML 异步的JavaScript 和 XML1.异步和同步:客户端和服务器端相互通信的基础上同步:客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。异步:客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端…

mysql初识

mysql需要了解哪些知识 1.sql操作 2.索引 索引原理 索引优化 sql语句优化 3.事务 并发读异常的问题 并发死锁怎么解决 4. mysql与缓存 解决读性能问题 集群的内容OLTP: OLTP(online transaction processing)翻译为联机事务处理;主要对数据库增删改查; OLTP主要用来记录某类…

5个必知的高级SQL函数

5个必知的高级SQL函数SQL是关系数据库管理的标准语言,用于与数据库通信。它广泛用于存储、检索和操作数据库中存储的数据。SQL不区分大小写。用户可以访问存储在关系数据库管理系统中的数据。SQL允许描述数据。用户可以轻松创建和删除表和数据库。我们可以使用SQL库、模块和预…

Golang基础教程

以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一、go语言结构: 二、go基础语法:三、变量四、常量五、运算符 六、条件语句 七、循环 八、函数 九、变量作用域 十、数组 十一、指针 十二、结构体 十三、切片 十四、范围(Range) 十五、集合 十六、递归 十七、…

ceph 009 管理定义crushmap 故障域

管理和自定义crushmap 定义pg到osd的映射关系 通过crush算法使三副本映射到理想的主机或者机架 更改故障域提高可靠性 pg到osd映射由crush实现下载时需要将对象从osd搜索到,组成文件,那么对象多了就会效率变低,那么从pg组里面搜索。提高效率 对象放在pg要通过hash算法 95个…

网络编程-TCP通信程序(下)代码

TCP通信的客户端:向服务器发送连接请求,给服务端发送数据,读取服务端回写的数据 表示客户端的类:java.net.Socket:该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点。套接字:包含了IP地址和端口号的网络单位 构造方法: Socket(String host, …

IfcDocumentInformation

IfcDocumentInformation实体定义 IfcDocumentInformation捕获外部文档的“元数据”。本规范未定义文件的实际内容;相反,它可以在Location属性之后找到。可以使用IfcDocumentReference从交换结构中全部或部分引用相同的IFCDocationInformation(例如,通过引用特定章节或段落)…

Volatile介绍

介绍 volatile 是 Java 虚拟机提供的轻量级的同步机制,它可以保证可见性(缓存一致性协议)和有序性(禁止指令重排序,也就是通过内存屏障来实现),但是不保证原子性。JMM 介绍 JMM 是一个抽象的概念,它描述的是一种规范。这些规范定义了程序中各种变量的访问规则。 JMM 定…

monodepth2学习-KITTI数据集内容

KITTI数据集介绍 monodepth2采用KITTI数据集进行训练,KITTI数据集主要是针对自动驾驶领域的图形处理技术,主要应用在评测立体图像(stereo)、光流(optical flow)、3D物体检查等计算机视觉领域。KITTI数据集采用配备有两个灰度摄像头,两个彩色摄像头和一个Velodye 64激光雷…

代码审计-PHP反序列化漏洞

什么是序列化序列化可以实现将对象压缩并格式化,方便数据的传输和存储。 为什么要序列化? PHP 文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有了对象序列化,实现对象的长久存储,对象序列化之后存储起来,下次调用时直接调出来反序列化之后就…

世事无常,人生有定,此乃时也、运也、命也

参考: https://www.163.com/dy/article/H6NVOULE0528OPI5.html“万般皆由命,半点不由人。”半生已过,红尘辗转,才真正明白人的寿命与财富,在你来到人世间的那一刻上天就安排好了,半点由不得我们自己。正所谓“世事无常,人生有定,此乃时也、运也、命也!” 所谓命者。先…

三次握手,四次挥手

三次握手 连接建立阶段: 第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中:SYN=1,seq=x。 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。 第三次握手:客户端收到确认报文之后…