Mybatis学习笔记11 缓存相关

Mybatis学习笔记10 高级映射及延迟加载_biubiubiu0706的博客-CSDN博客

缓存:cache

缓存的作用:通过减少IO的方式,来提高程序的执行效率

Mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库.一方面是减少了IO.另一方面不再执行繁琐的查找算法.提高效率.

Mybatis自带的缓存机制包括:

一级缓存:将查询到的数据存储到SqlSession中.

二级缓存:将查询到的数据存储到SqlSessionFactory中.

或者集成其他第三方的缓存:比如EhCache(Java语言开发的),Memcache(C语言开发的)等

SqlSession和SqlSessionFactory的生命周期

SqlSessionFactory:一旦被创建就应该在应用的运行期间一直存在.

SqlSession:每一个线程都应该有它自己的SqlSession实例.

那么一级缓存就是说一个线程内的多次的相同查询会被缓存.也就是说只针对当前会话.而且默认开启

而二级缓存是存放在SqlSessionFactory中的.那么会在整个应用访问期间一直存在

Mybatis中的缓存只针对DQL语句,也就是说缓存机制只对应select语句

先来看一个例子,这是上篇结尾的测试

大概目录结构  进行测试

1.一级缓存

Mybatis中一级缓存默认开启,不需要任何配置.

只要使用同一个SqlSession对象执行同一条SQL语句,就会走缓存.

查数据库没有的

再测试

什么时候不走一级缓存

1.SqlSession对象不是同一个,因在SqlSessionUtil里用了ThreadLocal,所以演示sqlSession不一样,需要从SqlSessionFactory里取

2.查询条件不一样

什么时候一级缓存失效?

第一次DQL和第二次DQL之间做了以下两件事中的任意一件,都会让一级缓存清空.

1.执行了sqlSession的clearCache()方法.这是手动清空缓存

2.执行了INSERT或DELETE或UPDATE语句.注意:不管你操作的是那张表.都会清空一级缓存

测试.clearCache()

测试执行了任意表的增删改操作  这里忘记commit了 但即使没有commit缓存也清空了

注意:sqlSession.close()方法,只是关闭sqlSession,如果用了连接池,只是将sqlSession的状态更改为不可用,和commit没有关系,如果开启了事务,没有commit就不会提交

commit了

二级缓存

二级缓存的范围是SqlSessionFactory(应用运行期间)

使用二级缓存需要同时具备以下几个条件:

1.在Mybatis核心配置文件中配置<setting name="cacheEnabled" value="true">全局性的开启或关闭所有映射配置文件(XXX.xml)中已配置的任何缓存.默认就是true,一般无需设置.

2.在需要使用二级缓存的XXX.xml映射文件中添加:<cache />

3.使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口

4.SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中.此时二级缓存才可用.

要求1--->默认开启

要求2--->在需要使用二级缓存的XXX.xml映射文件中添加:<cache />

要求3--->实现序列化接口

要求4--->SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中.此时二级缓存才可用.

如果这样的话都不会存到

注意日志中的缓存命中率

二级缓存什么时候失效:只要两次查询之间出现了增删改操作,二级缓存就会失效.当然一级缓存也会失效

二级缓存相关配置

Mybatis集成EhCache

注意:集成EhCache是为了代替Mybatis得二级缓存,一级缓存无法替代.

也就是说集成EhCache是将原先保存在SqlSessionFactory中的缓存,放到第三方缓存插件中

Mybatis对外提供了接口.可以集成第三方缓存组件.比如EhCache,MemCache等

集成EhCache步骤:

1.引入依赖

<!--mybatis集成ehcache的组件-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.2</version>
</dependency>
<!--ehcache需要slf4j的⽇志组件,log4j不好使-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
2.在类的根路径下新建ehcache.xml文件,并配置以下配置信息
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><!--磁盘存储:将缓存中暂时不使⽤的对象,转移到硬盘,类似于Windows系统的虚拟内存--><diskStore path="e:/ehcache"/><!--defaultCache:默认的管理策略--><!--eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断--><!--maxElementsInMemory:在内存中缓存的element的最⼤数⽬--><!--overflowToDisk:如果内存中数据超过内存限制,是否要缓存到磁盘上--><!--diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false--><!--timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多⻓时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示⼀直可以访问--><!--timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示⼀直可以访问--><!--memoryStoreEvictionPolicy:缓存的3 种清空策略--><!--FIFO:first in first out (先进先出)--><!--LFU:Less Frequently Used (最少使⽤).意思是⼀直以来最少被使⽤的。缓存的元素有⼀个hit 属性,hit 值最⼩的将会被清出缓存--><!--LRU:Least Recently Used(最近最少使⽤). (ehcache 默认值).缓存的元素有⼀个时间戳,当缓存容量满了,⽽⼜需要腾出地⽅来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存--><defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
</ehcache>

3.修改XXX.xml(映射文件)文件中的<cache />标签,添加type属性

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

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

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

相关文章

【新版】系统架构设计师 - 案例分析 - 信息安全

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 信息安全安全架构安全模型分类BLP模型Biba模型Chinese Wall模型 信息安全整体架构设计WPDRRC模型各模型安全防范功能 网络安全体系架构设计开放系统互联安全体系结构安全服务与安全机制…

Windows 基于Visual Studio 开发Qt 6 连接MySQL 8

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 3、MySQL 8 Qt 6 配置MySQL 8 动态/静态连接库和MySQL 8 驱动。 libmysql.dll 和libmysql.lib是QT所需的动态和静态链接库&#xff1b;qsqlmysql.dll 和qsqlmysql.dll.debug是Qt所需的mysql驱…

C#通过重写Panel改变边框颜色与宽度的方法

在C#中,Panel控件是一个容器控件,用于在窗体或用户控件中创建一个可用于容纳其他控件的面板。Panel提供了一种将相关控件组合在一起并进行布局的方式。以下是Panel控件的详细使用方法: 在窗体上放置 Panel 控件: 在 Visual Studio 的窗体设计器中,从工具箱中拖动并放置一…

2023 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|数学建模完整代码+建模过程全解全析

问题一&#xff1a;区域碳排放量以及经济、人口、能源消费量的现状分析 思路&#xff1a; 定义碳排放量 Prediction 模型: CO2 P * (GDP/P) * (E/GDP) * (CO2/E) 其中: CO2:碳排放量 P:人口数量 GDP/P:人均GDP E/GDP:单位GDP能耗 CO2/E:单位能耗碳排放量 2.收集并统计相关…

基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库

文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统&#xff0c;是基于 Java SpringBoot 开发的。主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。 &#xff08;1&#xff09;管…

【LeetCode热题100】--238.除自身以外数组的乘积

238.除自身以外数组的乘积 思路&#xff1a; 利用索引左侧所有数字的乘积和右侧所有数字的乘积&#xff08;即前缀和后缀&#xff09;相乘得到答案 算法&#xff1a; 1.初始化两个空数组L和R&#xff0c;对于给定索引i&#xff0c;L[i]代表的是i左侧所有数字的乘积&#xff…

Android设计支持库

本文所有的代码均存于 https://github.com/MADMAX110/BitsandPizzas 设计支持库&#xff08;Design Support Library&#xff09;是 Google 在 2015 年的 I/O 大会上发布的全新 Material Design 支持库&#xff0c;在这个 support 库里面主要包含了 8 个新的 Material Design …

华为数通方向HCIP-DataCom H12-831题库(单选题:121-140)

第121题 在华为交换机上配置RADIUS服务器模板时,下列选项中哪些参数为可选的配置参数? A、认证服务器地址和端口 B、RADIUS自动探测用户 C、计费服务器地址和端口 D、Shared-key 答案: B 解析: 在华为交换机上配置 radius 服务器模板时,需要配置共享秘钥,认证服务器地址…

git revert 撤销之前的提交

git revert 用来撤销之前的提交&#xff0c;它会生成一个新的 commit id 。 输入 git revert --help 可以看到帮忙信息。 git revert commitID 不编辑新的 commit 说明 git log 找到需要撤销的 commitID &#xff0c; 然后执行 git revert commitID &#xff0c;会提示如下…

第二证券:A股市场的投资者结构如何?什么叫“四大类”?

有很多的出资者在A股商场上进行着出资生意&#xff0c;并且这些出资者又分为许多类型。详细的&#xff0c;A股商场的出资者结构怎样&#xff1f;什么叫做“四大类”&#xff1f;关于这些&#xff0c;本文将借用相关知识来作部分讨论&#xff0c;以供咱们参阅。 A股商场的出资者…

广东桉木建筑模板:天然美触,打造高品质建筑

在广东这片充满活力和创新的土地上&#xff0c;桉木建筑模板以其独特的天然美触和卓越的性能而备受瞩目。作为一种优质的建筑材料&#xff0c;广东桉木建筑模板在建筑行业中扮演着重要的角色。它的出色性能和独特韵味使其成为建筑领域中备受青睐的选择。广东桉木建筑模板以其独…

【线性回归、岭回归、Lasso回归分别预测患者糖尿病病情】数据挖掘实验一

Ⅰ、项目任务要求 任务描述&#xff1a;将“diabetes”糖尿病患者数据集划分为训练集和测试集&#xff0c;利用训练集分别结合线性回归、岭回归、Lasso回归建立预测模型&#xff0c;再利用测试集来预测糖尿病患者病情并验证预测模型的拟合能力。具体任务要求如下&#xff1a; …

springboot 获取参数

1.获取简单参数 2.实体对象参数

OpenHarmony应用分发运营体系

一、分发流程 图片来源&#xff1a;OpenHarmony官网 二、主要途径 更多 开鸿智谷在鸿OS 开发板 设备 润和HiHopeOS 开发板 设备 软通动力SwanLinkOS 开发板 设备 深开鸿KaiHongOS 开发板 设备 华为HarmonyOS AGC 18N 开放原子开源基金会OpenHarmony 底座基础

grafana结合Skywalking追踪Trace(一)

SW应用中对Trace的跟踪一直占有重要的地位&#xff0c;即可以用户指定的tag值&#xff0c;可以筛选出感兴趣的trace(跟踪链)&#xff0c;用户可以通过跟踪链追踪各个Span的详细情况。 但是在使用SW OAP原生页面中会存在两个问题&#xff1a; 1&#xff09; Trace数量太多了&…

支撑位和阻力位在Renko和烛台图如何使用?FPmarkets澳福3秒回答

很多投资者都知道&#xff0c;Renko图表和普通日本烛台都会采用相同的交易信号&#xff0c;即支撑位和阻力位。那么支撑位和阻力位在Renko和烛台图如何使用?FPmarkets澳福3秒回答。 这些信号在任何时间框架上都会出现&#xff0c;且在蜡烛图交易中颇受欢迎。对于Renko图表而言…

sentinel环境搭建以及微服务接入

• sentinel部署 • sentinel-镜像制造 • sentinel-镜像推送 • sentinel-部署配置文件 • 访问控制台 • 外网访问控制台 • 集群内访问 • 配置规则 • 限流效果 • 微服务接入 • pom文件引入依赖 • pod部署文件添加配置 Sentinel 控制台是流量控制、熔断降级规则统一配置…

Python的安装教程(Windows)

简单理解就两个动作&#xff1a;安装python、安装PyCharm 我们要跟着做&#xff01;&#xff01;&#xff01; 编辑器和编译器 编辑器和编译器是两个不同的概念。编辑器是一种编写代码的工具&#xff0c;方便人对程序的操作和管理。常见的编辑器有文本编辑器、网页编辑器、源…

markdown

title: “Markdown” createTime: 2022-01-05T10:33:2908:00 updateTime: 2022-01-05T10:33:2908:00 draft: false author: “name” tags: [“markdown”] categories: [“software”] description: “测试的” markdown学习总结 标题的使用 一级标题&#xff1a;使用"…

快速排序代码及时间空间复杂度

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它的平均时间复杂度为 O(n log n)&#xff0c;是许多排序算法中性能最好的之一。下面是快速排序的代码示例和时间空间复杂度分析&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#x…