MyBatis:一级缓存和二级缓存

文章介绍了缓存的基本概念,强调其在提高查询效率中的作用。MyBatis的一级缓存是SqlSession级别,同一次会话内的相同查询会从缓存读取,而二级缓存是Mapper映射文件级别,可跨SqlSession共享,需要实现Serializable接口。缓存的生命周期和过期时间也在文中提及。
摘要由CSDN通过智能技术生成

一. 概念

1.1 定义

缓存是存在于内存中的临时数据;

1.2 作用

查询的时候从缓存读取,能减少和数据库的交互,提高效率;

1.3 使用场景

(1)适合用缓存:

  • 经常查询并且不常改变的;
  • 数据的正确与否对最终结果影响不大;

(2)不适合用缓存:

  • 经常改变的数据;
  • 数据的正确与否对结果影响较大的;

二. MyBatis一级缓存

2.1 引入

当使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象。

如果我们很有可能多次查询完全相同的sql语句,每一次查询都查询一次数据库,那查询数据库代价是比较大的,这会导致系统的资源浪费;

为了解决这个问题,Mybatis对每一次会话都添加了缓存操作,相同的SQL不用再查数据库;

2.2 简介

一级缓存是 默认开启 的。

一级缓存作用域是sqlsession级别的;

同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,后序的查询将会从一级缓存读取,而不会查数据库,提升了效率。

2.3 生命周期

MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,当会话结束时,SqlSession对象会被释放掉。

即一级缓存的生命周期是一次会话

三. MyBatis二级缓存(全局缓存)

3.1 简介

二级缓存是 默认关闭 的。

二级缓存是 Mapper 映射文件级别的缓存,多个 SqlSession 去操作同一个 Mapper 的 sql 语句,多个 SqlSession 可以共享二级缓存,二级缓存是跨 SqlSession 的全局变量。

在这里插入图片描述

当 Mybatis 调用 Dao 层查询数据库时,先查询二级缓存,二级缓存中无对应数据,再去查询一级缓存,一级缓存中也没有,最后去数据库查找。

在这里插入图片描述

3.2 何时存入

在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中

开启了二级缓存后,还需要将要缓存的pojo实体类实现Serializable接口,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中。

3.3 过期时间

当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。

参考:
https://blog.csdn.net/guorui_java/article/details/118095020
https://mikechen.cc/17833.html
https://zhuanlan.zhihu.com/p/388720463

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值