mybatis缓存

Mybatis的缓存,包括一级缓存和二级缓存

一级缓存指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

一级缓存是默认使用的。
二级缓存需要手动开启。

第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。
得到用户信息,将用户信息存储到一级缓存中。

如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

在这里插入图片描述

Mybatis默认支持一级缓存

准备一个只有mybatis的工程

在这里插入图片描述

测试验证

一级缓存是sqlSession级别的

在这里插入图片描述

在这里插入图片描述

当发生插入,更新,删除等操作,且执行了
commit操作,则一级缓存会情况,为了防止数据脏读
及时跟新读取数据

在这里插入图片描述

二级缓存

正式开发,是将mybatis和spring进行整合开发,事务控制在service中。
一个service方法中包括 很多mapper方法调用。

service{
//开始执行时,开启事务,创建SqlSession对象
//第一次调用mapper的方法findUserById(1)

//第二次调用mapper的方法findUserById(1),从一级缓存中取数据
//方法结束,sqlSession关闭

}

如果是执行两次service调用查询相同 的用户信息,不走一级缓存,因为session方法结束,sqlSession就关闭,一级缓存就清空。

二级缓存是mapper级别的。

第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。
第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。
如果调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操作。此时会清空该namespace下的二级缓存。

所谓二级缓存其实就是 将相同的sql查询结果使用命名空间namespace分类存储而已,需要在不同的Mapper.xml文件中开启

开启二级缓存

Mybatis默认是没有开启二级缓存

在这里插入图片描述

在UserMapper映射文件中,加入以下内容,开启二级缓存:

注意:

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

上面是总开关,当你开启总开关之后,不会让所有的缓存都开启,所以还要在需要开启二级缓存的映射文件下加上下面标签

在这里插入图片描述
实现序列化
什么是序列化?
将对象的状态信息转换为可以存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时存储区或持久性存储区,之后,便可以通过从存储区中读取或反序列化对象的状态信息,来重新创建该对象

什么情况下需要序列化?
当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化
例如将对象写入到本地文件中,通常也需要实现序列化

由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。
如果该类存在父类,那么父类也要实现序列化。

public class User implements Serializable {

测试

一个二级缓存区域对应多个sqlsession
创建多个sqlSession,模拟Service层同时访问相同的查询操作
在这里插入图片描述

虽然关闭了sqlSession,但是由于是二级缓存,则依然会存入到内存中
再次进行相同Mapper文件的操作也会从缓存中获取到

在这里插入图片描述

如果执行commit,则会清空二级缓存
加上commit操作之后,第二次查询就会重新从数据库中取

在这里插入图片描述

如果是ssm框架项目,则执行del,update,等相关操作即可清除缓存

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值