Mybatis 的一级缓存和二级缓存

一级缓存

在这里插入图片描述

1.定义

  • 一级缓存基于 sqlSession 默认开启,在操作数据库时需要构造 SqlSession 对象,在对象中有一个 HashMap 用于存储缓存数据。不同的 SqlSession 之间的缓存数据区域是互相不影响的。一级缓存的作用域是 SqlSession 范围的,当在同一个 sqlSession 中执行两次相同的 sql 语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

  • 需要注意的是,如果 SqlSession 执行了 DML 操作(增删改),并且提交到数据库,MyBatis 则会清空 SqlSession 中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。

  • 当一个 SqlSession 结束后该 SqlSession 中的一级缓存也就不存在了。关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。

2.一级缓存的生命周期有多长?

  • MyBatis 在开启一个数据库会话时,会 创建一个新的 SqlSession 对象,SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新的 PerpetualCache 对象;当会话结束时,SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。

  • 如果 SqlSession 调用了 close () 方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。

  • 如果 SqlSession 调用了 clearCache (),会清空 PerpetualCache 对象中的数据,但是该对象仍可使用。

  • SqlSession 中执行了任何一个 update 操作 (update ()、delete ()、insert ()) ,都会清空 PerpetualCache 对象的数据,但是该对象可以继续使用


二级缓存

在这里插入图片描述

1.二级缓存是 mapper 级别的缓存

  • 使用二级缓存时,多个 SqlSession 使用同一个 Mapper 的 sql 语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用 HashMap 进行数据存储。相比一级缓存 SqlSession,二级缓存的范围更大,多个 Sqlsession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

  • 二级缓存的作用域是 mapper 的同一个 namespace。不同的 sqlSession 两次执行相同的 namespace 下的 sql 语句,且向 sql 中传递的参数也相同,即最终执行相同的 sql 语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。

  • 二级缓存是 mapper 级别的缓存, 多个 SqlSession 去操作同一个 Mapper 的 sql 语句,多个 SqlSession 去操作数据库得到数据会存在二级缓存区域,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。 二级缓存是多个 SqlSession 共享的,其作用域是 mapper 的同一个 namespace,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。

  • Mybatis 默认没有开启二级缓存需要在 setting 全局参数中配置开启二级缓存。

  • 缓存会使用默认的 Least Recently Used(LRU,最近最少使用的)算法来收回。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员世杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值