后端:MyBatis缓存知识介绍

               

今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助!

一、MyBatis一级缓存

1、一级缓存介绍

当我们的程序MyBatis开启一次和数据库的会话,MyBatis会自动创建出一个SqlSession对象表示这一次数据库的会话。在同一个数据库会话当中,MyBatis提供了一级缓存的方案优化这部分场景,针对相同的SQL查询语句,会优先命中一级缓存,避免再次对数据库进行查询,从而提高查询性能、减轻数据库的压力。

               

开启一级缓存

MyBatis的配置文件加上如下:

<setting name="localCacheScope" value="SESSION"/>

注意:localCacheScope 值有两个 SESSION(开启一级缓存)/Statement(关闭一级缓存)

一级缓存失效场景

  • SqlSeesion实例不同

  • SqlSeesion实例相同,查询条件不同

  • SqlSeesion对象相同,查询条件也相同,但两次查询之间执行了增删改操作

  • SqlSeesion对象相同,两次查询条件相同,中间无其它增删改操作,但使用了clearCache()方法

总结

  • MyBatis一级缓存的生命周期和SqlSession一致。默认是开启状态。

  • MyBatis一级缓存采用HashMap性能较差

  • 分布式环境下对数据库操作容易引起脏数据,不推荐开启MyBatis一级缓存

二、MyBatis二级缓存

1、二级缓存介绍

MyBatis一级缓存生命周期是一个SqlSession内部,如果多个 SqlSession 需要共享缓存,则需要开启二级缓存,开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在CachingExecutor 进行二级缓存的查询。

               

2、为什么有二级缓存?

1、为了避免和数据库频繁交互。这是设计缓存的主要原因。

2、当Spring和MyBatis整合时,每次查询之后都要进行关闭sqlsession,关闭之后数据被清空。所以MyBatis和Spring整合之后,一级缓存是没有意义的。如果开启二级缓存,关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到mapper namespace的二级缓存中。这样,缓存在sqlsession关闭之后依然存在。

当开启二级缓存数据库查询流程先后顺序为:二级缓存 -> 一级缓存 -> 数据库

3、如何开启二级缓存

二级缓存默认是不开启的,需要手动开启二级缓存,MyBatis的配置文件加上如下:

<settings><setting name = "cacheEnabled" value = "true" /></settings>

然后在还需要在 Mapper 的xml 配置文件中加入 <cache>标签

cache属性介绍

eviction:设置回收策略,默认是LRU策略。

  • LRU - 最近最少回收,移除最长时间不被使用的对象

  • FIFO - 先进先出,按照缓存进入的顺序来移除它们

  • SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象

  • WEAK - 弱引用,更积极的移除基于垃圾收集器和弱引用规则的对象

flushinterval:缓存刷新间隔,缓存多长时间刷新一次,默认不清空,设置一个毫秒值

readOnly: 是否只读;true 只读,MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。MyBatis 为了加快获取数据,直接就会将数据在缓存中的引用交给用户。不安全,速度快。读写(默认):MyBatis 觉得数据可能会被修改

size : 缓存可存放多少个元素

type: 指定自定义缓存的全类名(实现Cache 接口即可)

blocking:若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。

注意:

1、在事务提交之前,并不会真正存储到二级缓存,而是先存储到一个临时属性,等事务提交之后才会真正存储到二级缓存。因此需要commit事务之后才能生效。

2、如果使用的是MyBatis默认缓存,结果集对象需要实现序列化接口(Serializable),否则会报错。

4、二级缓存适用场景

1、适合频繁访问且用户对查询结果实时性要求不是很高的查询,

这时采用二级缓存可降低数据库访问量,提高数据库的性能,例如:查询耗时较高的统计报表SQL、按固定时间维度查询的SQL(每月的订单信息等等)。

2、适合查询多写入少的场景开启。

因为任何对数据库的(insert、update、delete)操作都会触发缓存的更新,从而造成缓存失效。

5、二级缓存失效场景

  • 第一次SqlSession 未提交

  • 对数据库对应的数据表执行了的(insert、update、delete)操作

6、总结

mybatis二级缓存针对大多数的业务系统都不推荐使用,因为业务系统数据操作比较频繁、自带的二级缓存性能也不是很高。二级缓存很难起到实际的作用。可以引用第三方缓存。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

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

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

相关文章

软件:10款免费无广告的看图软件,总有一款适合你

目录 一、专业型看图软件 1.Windows照片 2.Honeyview 3.EzViewer 4.XnView MP 5.JPEGView 6.Irfan View 二、综合型文件查看 1.Quicklook 2.爱奇艺万能联播 3.WPS图片 4.谷歌浏览器 一、专业型看图软件 1.Windows照片 Windows自带的照片应用就是一款比较强大的看图软件&#xf…

Sentinel介绍与使用

一、Sentinel简介 Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 二&#xff1a;Sentinel 功能和设计理念 流量控制 流量控制在网络传输中是一个常用的概念&#xff0c;它用于调整网络包的发送数据。然而…

电脑知识:BIOS和UEFI的对比介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

缓存更新的套路

看到好些人在写更新缓存数据代码时&#xff0c;先删除缓存&#xff0c;然后再更新数据库&#xff0c;而后续的操作会把数据再装载的缓存中。然而&#xff0c;这个是逻辑是错误的。试想&#xff0c;两个并发操作&#xff0c;一个是更新操作&#xff0c;另一个是查询操作&#xf…

怎样获取当前页面值php,想要得到当前页面的所有url参数信息怎么用PHP来实现?...

本篇文章主要给大家介绍怎么使用php获取完整url。首先给新手小白们简单介绍下什么是url。百度百科上是这么解说的&#xff0c;统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示&#xff0c;是互联网上标准资源的地址。互联网上的每个文件都有一个唯…

@PostConstruct注解学习,最详细的分享教程

该注解可以实现在运行工程时&#xff0c;自动运行该注解下的方法&#xff1b; PostConstruct是java自带的注解&#xff0c;指的是在项目启动的时候执行这个方法&#xff0c;也可以理解为在spring容器启动的时候执行&#xff0c;可作为一些数据的常规化加载&#xff0c;比如数据…

电脑知识:分享实用的电脑维护小常识

目录 常识1&#xff1a;杜绝直接拔电脑电源强行关机 常识2&#xff1a;不要用电池玩游戏 常识3&#xff1a;开不了机可以尝试插拔内存条 常识4&#xff1a;电脑散热的处理方法 常识5&#xff1a;避免在电脑工作时拔插头 今天小编就为大家带来一些电脑日常实用中的维护小知识&am…

Sentinel实现黑白名单控制详细教程来了

一&#xff1a;新建一个IpRequestOriginParser类&#xff0c;实现RequestOriginParser接口&#xff0c;配置如下 public class IpRequestOriginParser implements RequestOriginParser {/*** Parse the origin from given HTTP request.** param request HTTP request* return …

D. Anton and Chess 模拟题 + 读题

http://codeforces.com/contest/734/problem/D 一开始的时候看不懂题目&#xff0c;以为象是中国象棋那样走&#xff0c;然后看不懂样例。 原来是走对角线的&#xff0c;长知识了。 所以我们就知道&#xff0c;王有八个方向&#xff0c;所以每个方向选一个来做代表就行了。 那么…

电脑知识:常见电脑蓝屏代码识别与处理方法

电脑蓝屏怎么办&#xff1f; 相信大家都遇到过蓝屏的问题&#xff0c; 有时候电脑用着用着就突然蓝屏了&#xff0c; 或者某天开机突然蓝屏了…… 电脑蓝屏的原因非常的多&#xff0c; 到底是什么引起的呢&#xff1f; 收集了一些最常见的几种蓝屏代码&#xff0c; 大家只需要如…

sentinel的@SentinelResource注解使用

客户自定义限流处理逻辑 创建ExceptionUtil类用于自定义限流处理逻辑 自定义限流处理类: ExceptionUtil 二&#xff1a;新增 SentinelResource注解 配置 SentinelResource(value “hello2”, blockHandler “exHandler”, blockHandlerClass {ExceptionUtil.class}) 通过…

办公技巧:10个WORD神操作,值得收藏

目录 1、F4键 2、Ctrl字母快捷键 3、巧用“文档比较” 4、巧用替换功能 5、特殊字体保存 6、Word表格随心粘 7、去除超链接 8、Word图片轻松移 9、截图 10、格式刷不停 在日常办公当中&#xff0c; Word文档就是我们最常用的软件之一。用它我们写论文、写方案、写小说等等。 但…

MYSQL学习:GROUP BY分组取最新的一条记录

日常开发当中&#xff0c;经常会遇到查询分组数据中最新的一条记录&#xff0c;比如统计当前系统每个人的最新登录记录、外卖系统统计所有买家最新的一次订单记录、图书管理系统借阅者最新借阅书籍的记录等等。今天给大家介绍一下如何实现以上场景的SQL写法&#xff0c;希望对大…

@SentinelResource注解实现热点限流

下图中请求url中param参数为axb&#xff0c;如果QPS超过5&#xff0c;就会限流 一&#xff1a;如下代码 RestController public class ParamController {GetMapping("/param")SentinelResource(value "param", blockHandler "exHandler")p…

硬件知识:固态硬盘4K对齐知识介绍

目录 1、什么是4K对齐呢&#xff1f; 2、怎么查看硬盘是否4K对齐呢&#xff1f; 3、怎么4K对齐呢&#xff1f; 现在大家基本都有一个固态硬盘&#xff0c;而在固态硬盘分区中4K对齐是非常重要的。 1、什么是4K对齐呢&#xff1f; “4K对齐”就是符合“4K扇区”定义格式化过的硬…

【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别

SpringCloudApplication注解 注解SpringCloudApplication包括&#xff1a;SpringBootApplication、EnableDiscoveryClient、EnableCircuitBreaker&#xff0c;分别是SpringBoot注解、注册服务中心Eureka注解、断路器注解。对于SpringCloud来说&#xff0c;这是每一微服务必须应…

网络知识:路由器常见故障分析及处理方法

目录 1.路由器的部分功能无法实现 2.网络频繁掉线 3.无法浏览网页 4.某些应用无法使用 5&#xff0e;网络带宽达不到合同带宽或相差甚远 6.局域网内存在多个路由器&#xff0c;因人为原因出现二级路由 对当前的大多数网络来说&#xff0c;无论是实现网络互连还是访问Internet&a…

硬件技巧:如何隐设置的你的电脑U盘不可见

有时候电脑里面有重要内容&#xff0c;在不联网的情况下&#xff0c;还需要禁用U盘&#xff0c;下面介绍禁用U盘的方法&#xff0c;原创文章&#xff0c;转载注明出处即可。 第一步&#xff0c;首先在电脑上点击开始按钮&#xff0c;或者直接按下快捷键组合"WinR"&am…