后端:MyBatis缓存知识介绍,你学到了吗?

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

[[421367]]

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

一、MyBatis一级缓存

1、一级缓存介绍

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

开启一级缓存

MyBatis的配置文件加上如下:

  1. <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、为什么有二级缓存?

  • 为了避免和数据库频繁交互。这是设计缓存的主要原因。
  • 当Spring和MyBatis整合时,每次查询之后都要进行关闭sqlsession,关闭之后数据被清空。所以MyBatis和Spring整合之后,一级缓存是没有意义的。如果开启二级缓存,关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到mapper namespace的二级缓存中。这样,缓存在sqlsession关闭之后依然存在。

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

3、如何开启二级缓存

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

  1. <settings> 
  2.    <setting name = "cacheEnabled" value = "true" /> 
  3.  </settings> 

 

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

cache属性介绍

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

  • LRU - 最近最少回收,移除最长时间不被使用的对象
  • FIFO - 先进先出,按照缓存进入的顺序来移除它们
  • SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象
  • WEAK - 弱引用,更积极的移除基于垃圾收集器和弱引用规则的对象

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

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

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

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

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

注意:

  • 在事务提交之前,并不会真正存储到二级缓存,而是先存储到一个临时属性,等事务提交之后才会真正存储到二级缓存。因此需要commit事务之后才能生效。
  • 如果使用的是MyBatis默认缓存,结果集对象需要实现序列化接口(Serializable),否则会报错。

4、二级缓存适用场景

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

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

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

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

5、二级缓存失效场景

  • 第一次SqlSession 未提交
  • 对数据库对应的数据表执行了的(insert、update、delete)操作

6、总结

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

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

本文转载自微信公众号「IT技术分享社区」,可以通过以下二维码关注。转载本文请联系IT技术分享社区公众号。

 

责任编辑:武晓燕 来源: IT技术分享社区
相关推荐

2021-12-26 18:30:56

嵌入式ARM链接

2021-07-29 18:46:52

可视化类型图形化

2020-07-21 18:54:21

Rust类型转换语言

2023-10-16 08:55:43

Redisson分布式

2022-07-18 07:58:46

Spring工具工具类

2023-04-27 08:18:10

MyBatis缓存存储

2023-04-10 07:40:36

GraphQLRest通信模式

2022-07-19 08:04:04

HTTP应用层协议

2024-11-13 09:22:40

2023-06-03 00:05:18

TypeScriptJSDoc扫描器

2024-04-12 08:54:13

从库数据库应用

2024-07-31 09:28:56

2024-10-18 11:48:00

2020-02-22 15:01:51

后端前端开发

2021-08-16 23:52:31

手机内存技术

2024-08-12 15:44:06

2015-05-26 09:35:29

运维运维危机云计算应用

2023-04-26 22:52:19

视觉人脸检测人脸对齐

2023-06-06 08:14:18

核心Docker应用程序

2020-04-14 08:46:47

Java对象编译器
点赞
收藏

51CTO技术栈公众号