JavaEE简单示例——MyBatis的二级缓存机制

news2025/7/22 18:10:51

简单介绍:

在之前,我们介绍了关于MyBatis的一级缓存机制,之前我们说过,一级缓存是基于SqlSession的对同一条SQL语句多次查询的时候,会将第一次查询的结果缓存到内存中,之后的所有的相同的查询会直接从内存中获取数据,这样就避免了多次的连接数据库造成的资源浪费问题。但是此时还有一个问题,就是如果是多个SqlSession执行同一条SQL语句的时候呢?

因为一级缓存是基于同一个SqlSession的,所以当查询方法的对象并不是同一个的时候,就不会使用一级缓存机制,这样显然是并不能满足我们的使用的,所以这时候就出现了范围更大,使用更灵活的二级缓存,基于mapper的缓存机制。

二级缓存的机制是基于mapper的,所以他的策略是基于同一个SQL映射文件的所有的查询语句都会被缓存,这样即使SqlSession并不是同一个,也会触发缓存机制。

使用方法:

二级缓存需要我们进行手动配置,配置的方法也非常的简单,首先我们需要在mybatis的核心配置文件中开启namespace下的二级缓存,然后到SQL映射文件中添加一个新的标签,叫做<cache>标签即可。

在SQL映射文件中:

 这个标签就是空的,只需要存在即可 

代码实现:

在配置二级缓存之前,我们首先来看没有配置二级缓存的时候,当我们使用多个SqlSession对同一个SQL语句进行查询的时候是什么样的情况:

可以看到,我们在最上面的红框中定义了两个SqlSession,在中间对两个SqlSession进行赋值,然后在最下面使用两个SqlSession执行相同的SQL语句,结果如下:

可以看到,运行结果很明显就是由两个SqlSession发出的,会有两个connection和执行了两次SQL语句,最终输出两条结果。

现在我们打开二级缓存,首先是MyBatis的核心配置文件:

然后是SQL映射文件:

 

完成这样的配置之后,我们再来执行刚才的代码,观察控制台的输出结果:

 很明显,这次的查询结果比之前的简短了很多,并且最明显的就是,第二次查询并没有出现connection和SQL语句的执行,这就表示我们完成了两个不同的SqlSession查询同一SQL语句的时候依然可以进入缓存机制。 

<cache>的属性和在默认情况下实现的功能:

常用属性:

readOnly:表示缓存以只读的形式保存,当有新的缓存进入的时候,会直接删除旧的缓存,如果不配置这个属性,会导致一个报错。
flushInterval:刷新间隔,以毫秒为单位。即缓存的刷新间隔,默认不刷新
size:引用数目,默认为1024
eviction:回收策略,有四个值,分别对应四种不同的缓存回收策略,默认是LRU,即移除最长时间不使用的缓存。其次是FIFO,按照缓存进入的时间移除最早进入的缓存。

默认功能:

1.映射文件中所有的select语句都会被缓存下来。

2.映射文件中所有的增删改操作都会导致缓存被清空

3.缓存默认使用LRU回收机制,即回收最长时间不使用的缓存。

4.没有刷新间隔,不会刷新缓存。

5.缓存会默认存储列表集合或者对象的1024个引用,这个值可以通过size属性进行更改

6.缓存是可读/可写的,这也就表示对象的检索不是共享的,缓存可以安全的被调用者修改,而不同担心会修改其他调用者的缓存。

注意点:

这里唯一需要注意的就是如果<cache>标签没有设置readonly的值为true会报错,报错如下:

这个报错是由于,出现了新的缓存,而旧的缓存没有配置只读属性,所以他会默认的将缓存写入到硬盘中进行持久化存储,而我们对象到文件的持久化存储在没有实现序列化接口的时候就会报这个错误,所以我们可以选择让对象实现序列化接口,或者给<cache>标签没有设置readonly的值为true的形式来解决这个报错,我们推荐使用第二种添加属性的方式。

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

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

相关文章

修改redis改key值不改过期时间

今天在做图片验证码的时候遇到一个问题。用redis的生命周期来存放&#xff0c;用户输入错误次数。 三十秒内输错三次就&#xff0c;等待三十分钟。 那么问题来了&#xff0c;如果说第一次输入错误&#xff0c;应该是 key为用户用&#xff0c;value 为 次数2 ex就为30秒 &…

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…

M2E2: Cross-media Structured Common Space for Multimedia Event Extraction 论文解读

Cross-media Structured Common Space for Multimedia Event Extraction 论文&#xff1a;multimediaspace2020.pdf (illinois.edu) 代码&#xff1a;limanling/m2e2: Cross-media Structured Common Space for Multimedia Event Extraction (ACL2020) (github.com) 期刊/会议…

【3D点云】目标检测总结(持续汇总)

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

Java Spring 中 Resources 路径若干问题

ant-style资源路径通配符 ANT通配符有三种&#xff1a; 最长匹配规则&#xff08;has more characters&#xff09;&#xff0c;即越精确的模式越会被优先匹配到。例如&#xff0c;URL请求/app/dir/file.jsp&#xff0c;现在存在两个路径匹配模式/**/*.jsp 和 /app/dir/*.js…

C++回顾(九)——多继承

9.1 多继承 9.1.1 概念 一个类有多个直接基类的继承关系称为多继承&#xff08;多个父类&#xff09;多继承声明语法 class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n {数据成员和成员函数声明 }&#xff1b;类 C 可以根据访问控制同时…

Git在某个节点切出新分支

操作前&#xff0c;必须先备份分支&#xff0c;避免丢失代码&#xff01;&#xff01;&#xff01;&#xff01; 操作前&#xff0c;必须先备份分支&#xff0c;避免丢失代码&#xff01;&#xff01;&#xff01;&#xff01; 操作前&#xff0c;必须先备份分支&#xff0c;避…

Mr. Cappuccino的第46杯咖啡——Maven多模块项目可插拔式打包部署方案

Maven多模块项目可插拔式打包部署方案需求调研前准备项目结构模块之间的依赖关系项目pom文件项目代码代码运行效果方案调研需要实现的效果解决方案代码实现打包运行效果完整打包测试插拔式打包测试最佳实践项目结构测试运行效果完整打包测试插拔式打包测试需求 早期的【train-h…

吐血整理,自动化测试pytest测试框架,资深测试带你少走弯路......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 Pytest框架详解 py…

ledcode----丢失的数字

目录 题目截图&#xff1a; 题目接口&#xff1a; 第一种解法&#xff1a; 思路&#xff1a; 第二种解法&#xff1a;差值法 思路&#xff1a; 第三种解法&#xff1a;位运算异或法 关于异或操作符的预备知识&#xff1a; 思路&#xff1a; 例子&#xff1a;输入数组[0…

海思3531a pjsip交叉编译

学习文档&#xff1a; PJSUA2 Documentation — PJSUA2 Documentation 1.0-alpha documentationhttps://www.pjsip.org/docs/book-latest/html/index.html ./configure --prefix/opensource/pjproject-2.12/build3531a \ --host/opt/hisi-linux/x86-arm/arm-hisi…

MySQL全解[集群篇]

目录日志错误日志二进制日志格式查看删除查询日志慢查询日志主从复制原理docker搭建分库分表拆分策略垂直拆分垂直分库垂直分表水平拆分水平分库水平分表实现技术MyCat2mysql2对比mycat1.xdocker运行mycat2日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记…

NYUv2生成边界GT(2)

由NYUv2生成边界GT(1)可知&#xff0c;我们每张GT图片都生成一个对应的.bin文件。存放在D:\datasets\data_proc\train\edge_labels_40文件夹下&#xff0c;下一步我们需要生成.png文件&#xff0c;即需要使用convert_bin_to_png.py。 # -*- coding: utf-8 -*- import numpy as…

【Azure 架构师学习笔记】-Azure Storage Account(1)- Queue Storage

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;1&#xff09;-类型简介 前言 Azure Storage Queues 是一个专门用来处理基于云环境队列的Azure 服务。每个队列都维护着…

Netty之ChannelHandler初解

目录 目标 Netty版本 Netty官方API 实战 Netty服务器 入栈ChannelHandler读入数据顺序案例 出栈ChannelHandler写出数据顺序案例 ChannelHandlerContext和NioSocketChannel写入数据时有什么不同 Pipeline添加多个ChannelHandler有什么意义 目标 掌握ChannelHandler基…

海康工业相机使用教程

工业相机使用一、硬件连接1、准备材料2、相机供电&#xff08;1&#xff09;区分电源适配器正负极&#xff08;2&#xff09;连接相机电源线缆&#xff08;3&#xff09;连接完成后&#xff0c;相机蓝色灯常亮则成功3、软件连接&#xff08;1&#xff09;MVS客户端下载地址&…

你真的会在阳光下拍照片么?

你好&#xff0c;我是小麥。 上节课我们讲了如何通过影子判断光的质量&#xff0c;也就是光的软硬&#xff0c;这节课我们来接着说一说光的方向和环境光的实际运用。 虽然在现实生活里&#xff0c;我们可能没有从软硬的角度观察过光线&#xff0c;但我相信你在拍照片的时候一…

第九章:Java集合

第九章&#xff1a;Java集合 9.1&#xff1a;Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面&#xff0c;不涉及持久化)操作的结构&#xff0c;简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后&#xff0c;其长度就确定了。数组一旦定义好&#xff…

计算机操作系统:实验三存储管理程序设计

一、目的和要求 目的 存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计&#xff0c;来了解虚拟存储技术的特点&#xff0c;掌握请求页式存储管理的页面置换算法。 要求…

数字工厂管理系统的应用案例

数字工厂管理系统是制造企业应用数字化工厂技术实现研发设计数字化、生产准备数字化、 生产制造数字化、运营管理数字化和营销服务数字化的重要手段&#xff0c;即通过应用数字相关技术提升产品全生命周期数字化水平&#xff0c;从而提升企业经营的可靠性、安全性和经济性。 任…