Mybatis缓存机制(图文并茂!)
目录
一级缓存
需求我们在一个测试中通过ID两次查询Monster表中的信息。
二级缓存
案例分许(和上述一样的需求)
EhCache第三方缓存
在了解缓存机制之前,我们要先了解什么是缓存:
缓存是一种高速存储器,用于暂时存储访问频繁的数据,以提高数据存取速度。
所以,缓存的目的就是用来提高检索的效率
在mybatis中我们是尽量避免java和DB的直接操作的,因为本质上他是一个网络操作,包括建立连接,释放连接等,效率很低,耦合性高,所以在java程序和数据库db之间有一个缓存机制,db数据库会首先将查询的数据放入缓存,下一次要用时,java程序会直接从缓冲中取,效率和速度都会大大的提高!
文档地址:mybatis – MyBatis 3 | XML 映射器
一级缓存
1. 默认情况下, mybatis 是启用一级缓存的也就是 本地缓存 /local Cache ,它是 SqlSession 级别的。2. 同一个 SqlSession 接口对象调用了相同的 select 语句 , 会直接从缓存里面获取,而不是再 去查询数据库。3. 当我们执行 sqlSession.clearCache(); 会使一级缓存失效
需求我们在一个测试中通过ID两次查询Monster表中的信息。
二级缓存
1. 二级缓存和一级缓存都是为了提高检索效率的技术2. 最大的区别就是作用域的范围不一样,一级缓存的作用域是 sqlSession 会话级别,在一次会话有效,而二级缓存作用域是全局范围,针对不同的会话都有效(就是在一个sqlsession和在多个sqlsession生效的区别)
二级缓存大致的工作原理:
当java程序像数据库申请数据时,首先执行的是CachingExecutor缓存执行器(默认是关闭二级缓存的),先去二级缓存中查找数据(这是mybatis自带的 ,也可以采用第三方的缓存库),如果查不到,就调用Executor去查询本地的缓存,也就是一级缓存。在查不到,就去DB中查找数据
案例分许(和上述一样的需求)
1.首先在mybatis-config中配置映射缓存(默认是打开的)
2.使用二级缓存时 entity 类实现序列化接口 (serializable),因为二级缓存可能使用到序列化技术
因为比如一些三方缓存,一级缓存是在内存中的,二级缓存要将其存在磁盘中,在java中奖对象保存在磁盘中就需要用到序列化技术
3. 在对应的 XxxMapper.xml 中设置二级缓存的策略
1. 理解二级缓存策略的参数
<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>
上面的配置意思如下:
创建了 FIFO 的策略,每隔 30 秒刷新一次,最多存放 360 个对象而且返回的对象被认为是
只读的。
eviction:缓存的回收策略
flushInterval:时间间隔,单位是毫秒,
size:引用数目,内存大就多配置点,要记住你缓存的对象数目和你运行环境的可用内存
资源数目。默认值是 1024
readOnly:true,只读
2. 四大策略
√ LRU – 最近最少使用的:移除最长时间不被使用的对象,它是默认
√ FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
√ SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
√ WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
可以在XML文件中配置这些属性(下面给大家解释)
测试结果
@Test
public void test02()
{Monster monsterById = monsterMapper.getMonsterById(1);System.out.println(monsterById);if(sqlSession != null){sqlSession.close();}System.out.println("因为开启了二级缓存,将sqlSession关闭,第二次存入二级缓存" +"中依然不会再次发送SQL语句");//此时的sqlSession是不一样的sqlSession了sqlSession = MyBatisUtils.getSqlSession();//获取MonsterMapper对象(通过类型获取对象)monsterMapper = sqlSession.getMapper(MonsterMapper.class);Monster monsterById2 = monsterMapper.getMonsterById(1);System.out.println(monsterById2);if(sqlSession != null){sqlSession.close();}
}
我们如果需要指定哪些方法需要用二级缓存,可以进行参数的指定
EhCache第三方缓存
1. EhCache 是一个纯 Java 的缓存框架,具有快速、精干等特点2. MyBatis 有自己默认的二级缓存 ( 前面我们已经使用过了 ) ,但是在实际项目中,往往使用的是更加专业的第三方缓存产品 作为 MyBatis 的二级缓存 ,EhCache 就是非常优秀的缓存产品
1.在pom.xml文件中加入相关的依赖
<dependencies>
<!--引入EhCache--><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.6.11</version></dependency>
<!--引入slf4j日志输出jar包--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency>
<!--引入将mybatis和EhCache整合的jar包--><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.2.1</version></dependency></dependencies>
2. mybatis-config.xml中 打开二级缓存
3.在resource下配置ehcache.xml配置文件(直接copy上去就行)
一些配置参数的文档说明: https://www.taobye.com/f/view-11-23.html
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="https://ehcache.org/ehcache.xsd"updateCheck="false"><!--diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:user.home – 用户主目录user.dir – 用户当前工作目录java.io.tmpdir – 默认临时文件路径--><diskStore path="java.io.tmpdir/Tmp_EhCache"/><!--defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。--><!--name:缓存名称。maxElementsInMemory:缓存最大数目maxElementsOnDisk:硬盘最大缓存个数。eternal:对象是否永久有效,一但设置了,timeout将不起作用。overflowToDisk:是否保存到磁盘,当系统当机时timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。clearOnFlush:内存数量最大时是否清除。memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。FIFO,first in first out,这个是大家最熟的,先进先出。LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。--><defaultCacheeternal="false"maxElementsInMemory="10000"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="1800"timeToLiveSeconds="259200"memoryStoreEvictionPolicy="LRU"/><cachename="cloud_user"eternal="false"maxElementsInMemory="5000"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="1800"timeToLiveSeconds="1800"memoryStoreEvictionPolicy="LRU"/></ehcache>
1. MyBatis 提供了一个接口 Cache2. 只要实现了该 Cache 接口,就可以作为二级缓存产品和 MyBatis 整合使用 ,Ehcache 就是实现了该接口3. MyBatis 默认情况 ( 即一级缓存 ) 是使用的 PerpetualCache 类实现 Cache 接口的 , 是核心类4.当我们使用了 Ehcahce 后,就是 EhcacheCache 类实现 Cache 接口的,是核心类 .
相关文章:
Mybatis缓存机制(图文并茂!)
目录 一级缓存 需求我们在一个测试中通过ID两次查询Monster表中的信息。 二级缓存 案例分许(和上述一样的需求) EhCache第三方缓存 在了解缓存机制之前,我们要先了解什么是缓存: 缓存是一种高速存储器,用于暂时存储访问频繁的数据&…...
Git 工作区、暂存区和版本库
Git 工作区、暂存区和版本库 Git 是一个强大的版本控制系统,它帮助开发者管理代码历史,协作开发,以及跟踪和合并更改。为了更好地理解 Git 的工作流程,我们需要了解 Git 中的三个核心概念:工作区(Workspac…...
SSH 远程连接到 Linux 服务器上的 SQLite
通过 SSH 远程连接到 Linux 服务器上的 SQLite 数据库文件的流程,可以分为以下几个步骤: 通过 SSH 连接到远程 Linux 服务器。在远程服务器上执行 SQLite 命令行工具,操作数据库文件。在本地使用工具,通过 SSH 隧道间接访问远程的…...
使用ElasticSearch-dump工具进行ES数据迁移、备份
elasticsearch-dump基本使用 该工具基于第三方Elasticdump工具来实现,仓库地址:https://github.com/elasticsearch-dump/elasticsearch-dump/tree/master,用于更加快捷方便的将Elasticsearch不同集群的数据进行索引备份和还原。 一、安装 …...
SpringMVC源码-SpringMVC源码请求执行流程及重点方法doDispatch讲解
一、开始请求 在浏览器访问http://localhost:8080/spring_mymvc/userlist这个接口,是个get请求。 FrameworkServlet类的service方法会被请求到: 调用路径如下: service:945, FrameworkServlet (org.springframework.web.servlet) service:764, HttpSer…...
《深度学习》OpenCV 指纹验证、识别
目录 一、指纹验证 1、什么是指纹验证 2、步骤 1)图像采集 2)图像预处理 3)特征提取 4)特征匹配 5)相似度比较 6)结果输出 二、案例实现 1、完整代码 2、实现结果 调试模式: 三、…...
爬虫入门之爬虫原理以及请求响应
爬虫入门之爬虫原理以及请求响应 爬虫需要用到的库, 叫requests. 在导入requests库之前, 需要安装它, 打开cmd: 输入pip install 库名 pip install requests后面出现successful或requirement already就说明已经下载成功了!!! 下载出现的问题: 1.有报错或者是下载慢 修改镜像…...
CTF ciscn_2019_web_northern_china_day1_web1复现
ciscn_2019_web_northern_china_day1_web1 复现,环境源于CTFTraining 分析 拿到题目扫描,发现没有什么有用资产 扫描过程中注册账号登录,发现上传入口 上传文件,发现下载删除行为,寻找功能点,发现不能访问…...
docker命令汇总
Docker 是一个开源的应用容器引擎,它允许开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 以下是一些常用的 Docker 命令…...
云计算在现代企业中的应用与优势
云计算在现代企业中的应用与优势 随着信息技术的飞速发展,云计算已经成为现代企业不可或缺的一部分。作为一种创新的计算模式,云计算为企业提供了前所未有的灵活性和可扩展性,极大地推动了企业的数字化转型。 一、云计算的基本概念 云计算…...
Android平台GB28181实时回传流程和技术实现
规范解读 GB28181 中的 “INVITE” 是会话初始协议(SIP)中的一种请求方法,主要用于邀请一个或多个参与者加入特定的会话。在 GB28181 标准中,“INVITE” 请求通常用于发起媒体流的传输请求。当一个设备想要接收来自另一个设备的媒…...
Text-to-SQL方法研究
有关Text-to-SQL实现细节,可以查阅我的另一篇文章text-to-sql将自然语言转换为数据库查询语句 1、面临的挑战 自然语言问题往往包含复杂的语言结构,如嵌套语句、倒装句和省略等,很难准确映射到SQL查询上。此外,自然语言本身就存在歧义,一个问题可能有多种解读。消除…...
【Router】路由功能之MAC地址过滤(MAC Filter)功能介绍及实现
MAC地址过滤(MAC Filter) MAC 地址过滤是一种网络安全技术,通过在网络设备(如路由器)上设置规则,允许或阻止特定 MAC 地址的设备连接到网络。其主要作用是增强网络的安全性,防止未经授权的设备接入网络。 MAC Filter工作原理 MAC 地址过滤的工作原理是根据设备…...
Flink 本地 idea 调试开启 WebUI
Flink 本地 idea 调试开启 WebUI Maven 引用相关的包配置端口使用本地带UI环境启动 // maven 导入<!-- flink运行时的webUI --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-runtime-web</artifactId><version…...
如何识别IP地址是独享的还是共享的
在网络环境中,IP地址的分配和使用方式直接影响到用户的在线隐私和访问安全。选择独享IP还是共享IP取决于用户的具体需求,理解这两种IP地址的差异及其特点至关重要。本文将探讨如何区分独享IP和共享IP,以及各自的优缺点。 1. 什么是独享IP与共…...
X-Spreadsheet使用教程:打造你的Web端电子表格应用
在Web开发中,经常需要处理数据表格的展示与编辑,而X-Spreadsheet作为一款轻量级、功能强大的JavaScript电子表格库,为开发者提供了一个便捷的解决方案。本文将详细介绍如何使用X-Spreadsheet在Web项目中创建和配置电子表格,让你的…...
订餐点餐|订餐系统基于java的订餐点餐系统小程序设计与实现(源码+数据库+文档)
订餐点餐系统小程序 目录 基于java的订餐点餐系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布…...
Tkinter制作登录界面以及登陆后页面切换(一)
Tkinter制作登录界面以及登陆后页面切换(一) 前言序言1. 由来2. 思路3. 项目结构描述4. 项目实战1. 登录界面实现(代码)2. 首页界面实现(代码)3. 打包build.py(与main.py同级目录)4.…...
Colorful/七彩虹将星X17 AT 23 英特尔13代处理器 Win11原厂OEM系统 带COLORFUL一键还原
安装完毕自带原厂驱动和预装软件以及一键恢复功能,自动重建COLORFUL RECOVERY功能,恢复到新机开箱状态。 【格式】:iso 【系统类型】:Windows11 原厂系统下载网址:http://www.bioxt.cn 注意:安装系统会…...
《Ubuntu20.04环境下的ROS进阶学习8》
一、中断和定时器中断 在ROS中我们经常会遇到要使用中断函数的情况,中断函数的触发方式有很多种,比如检测到某个引脚的电平变化,或某个数据达到了一定的范围,但最实用的中断触发方式还是定时器中断。 二、编写ROS的中断代码 ros中…...
ubuntu24.04 怎么调整swap分区的大小,调整为16G
在Ubuntu中,swap分区的大小通常建议为物理内存的1到2倍,具体取决于你的使用需求和系统内存。例如,如果你有8GB内存,swap可以设置为8GB到16GB。swap的主要作用是当物理内存不足时,提供额外的虚拟内存,帮助防…...
【论文阅读】视觉里程计攻击
Adversary is on the Road: Attacks on Visual SLAM using Unnoticeable Adversarial Patch 一、视觉SLAM的不安全因素 根据论文的分析,视觉SLAM由于完全依赖于特征,缺少验证机制导致算法不安全。前端在受到干扰的情况下,会导致误匹配增加&…...
解决 Git LFS 切换分支失败问题
场景描述 在本地已有分支 A 的情况下,目前工作在分支 B。当尝试从 B 分支切回 A 分支时,由于 A 分支存在 LFS 上传的大文件,导致切换失败。这个问题通常是因为某些 LFS 文件在服务器上不存在或没有权限访问。 报错日志 切换分支时遇到的错…...
BaoStock 的安装
安装 pip3 install baostock使用这个库登录免费帐户时有时候会出现登录失败的问题 import baostock as bs # 登录系统 lg bs.login() # 登出系统 bs.logout()login failed! logout failed!可能是由于高版本的python需要验证ssl,本地将其设置为可信服务器地址可以…...
聚势启新 智向未来 | 重庆华阳通用科技有限公司揭牌成立
助推两江新区汽车产业高质量发展 (以下文字内容转载自两江新区网) 9月26日,重庆华阳通用科技有限公司(华阳通用重庆子公司)在两江新区揭牌成立,将致力于智能座舱、智能驾驶两大领域,不断加大技术研发投入…...
【数据结构与算法】Z算法(扩展KMP)(C++和Python写法)
Z算法(扩展KMP) 文章目录 Z算法(扩展KMP)朴素求法线性求法力扣类型题变种题:[3303. 第一个几乎相等子字符串的下标](https://leetcode.cn/problems/find-the-occurrence-of-first-almost-equal-substring/) 所谓Z算法&…...
免费语音转文字软件全览:开启高效记录新时代
在当今快节奏的信息时代,高效地处理和记录信息变得至关重要。语音转文字技术的出现,为我们带来了极大的便利,今天,就让我们一同探讨这些语音转文字免费的软件的使用方法。 1.365在线转文字 链接直达:https://www.pdf…...
PHP“===”的意义
在PHP中, 运算符被称为“恒等比较运算符”(Identical Comparison Operator),它用于比较两个变量的值和类型是否完全相同。这个运算符与双等号 (等值比较运算符)不同,后者在比较时会对两边的值进…...
Tomcat架构解析
Tomcat: 是基于JAVA语言的轻量级应用服务器,是一款完全开源免费的Servlet服务器实现。 1. 总体设计 socket: 其实就是操作系统提供给程序员操作“网络协议栈”的接口,你能通过socket的接口,来控制协议,实现网络通信,达…...
如何在 Kubernetes 上部署和配置开源数据集成平台 Airbyte?
在 Kubernetes 上部署和配置 Airbyte 是一个复杂但非常有价值的过程,特别是对于需要强大数据集成和数据处理能力的企业或团队。Airbyte 是一个开源的数据集成平台,允许用户从各种来源提取数据并加载到目标存储中。其强大的插件系统支持多种数据源与目标&…...
网络营销工作/sem优化软件选哪家
条款7 预先准备好内存不够的情况 operator new在无法完成内存分配请求时会抛出异常(老的编译器返回0); C常用的做法, 定义一个类型无关的宏来分配内存并检查是否成功; 123#define NEW(PTR, TYPE) \try { (PTR) new TYPE; } \catch (std::bad_alloc&) { assert(0); }>…...
网红网站建设/线下推广
我想做点击一个按钮 跳转页面 并且携带数据可以在js里可以获取页面是html的 用modelandView可以跳转页面 请问怎么可以获取携带的数据,写的代码格式是什么样的public ModelAndView sjDesigner() {ModelAndView modelAndView new ModelAndView();ArrayList list ne…...
潍坊网站建设兼职/上海好的seo公司
java 并发与线程池 java并发包使用Executor框架来进行线程的管理,Executor将任务的提交与执行过程分开,直接使用Runnable表示任务。future获取返回值。ExecutorService 继承了Executor接口,提供生命周器的管理,包括运行࿰…...
网站创意策划案/广告联盟平台
SQL Server AlwaysOn读写分离配置 pursuer.chen 备注: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链…...
wordpress滑动门/青岛app开发公司
鉴于numpy中矩阵的运算居多,所以以下内容中参与运算的数据元素都默认为矩阵,且以矩阵的逐元素相乘这个操作为例子进行说明。 numpy中的广播(broadcast)说白了就是干一件事——扩展矩阵,而且扩展对象都是纬度比较小的矩阵,将维度较…...
php网站链接支付宝/怎样在网上做宣传
<!--实现搜索结果的关键词变色标注的程序四月 5th, 2006 在搜索得到的文本中,从第一个关键词出现的前50个字开始显示,把关键词替换为红色,这比单纯的用replace得到的显示结果更人性化一些,因为用replace的话一旦关键词出现在文…...