MyBatis两种缓存

两级缓存:(map) 数据默认先放在一级缓存中,只有会话提交或者关闭以后才会从一级缓存放到二级缓存中

  1. 一级缓存:(本地缓存)sqlSession级别的缓存,一级缓存一直是开启的
    与数据库的同一次会话获取的数据会放到缓存中
    如果在同一次会话中需要获取相同的数据,直接从缓存中获取即可,不需要从数据库获取
    一级缓存失效的几种情况:
    1.sqlSession不同
    2.sqlSession相同,查询条件不一样
    3.sqlSession相同,执行了两次查询之间执行了增删改(可能对当前数据有影响,所以会失效)
    4.sqlSession相同,手动清除了一级缓存

  2. 二级缓存:基于namespace级别的缓存,一个namespace对应一个二级缓存
    工作机制:
    1.一个会话查询的数据,会被放到当前会话的一级缓存中
    2.如果会话关闭了,一级缓存中的数据会被保存到二级缓存中,新的会话查询信息可以从二级缓存中获取
    3.不同的namespace查出的数据会放到各自的缓存中(map)
    二级缓存的使用:
    1.开启全局二级缓存配置:(即使是默认的也要配置,防止版本变更)
    2.去每个mapper.xml中配置二级缓存:
    下面是cache标签中的一些参数:
    在这里插入图片描述
    3.POJO(javaBean)需要实现序列化接口(将数据从内存中写入硬盘)

缓存相关的设置/属性(第三条重要)

  1. cacheEnabled=true 用于开启二级缓存,一级缓存不受影响
  2. 每个select标签都有useCache=“true”(默认) 跟二级缓存有关,一级缓存不受影响
  3. 每个增删改标签:默认flushCache=“true” 一级二级缓存 都会被清除
    查询标签也有:flushCache=“true”
  4. sqlSession.clearCache() 只清除当前session的一级缓存
  5. localCacheScope:本地缓存作用域
    有两个值:SESSION 使用一级缓存 STATEMENT 禁用一级缓存

小结:每个SqlSession(会话)都有各自的一级缓存,每个mapper.xml文件中都有各自的二级缓存(需要进行开启配置),一个新的会话查找数据会先到二级缓存中查找有没有需要的数据,如果有就直接返回,没有就再看该会话的一级缓存中有没有,再没有就到数据库查找,然后将数据库返回的数据放到当前会话的一级缓存中,当会话关闭时,就会将该会话的数据转移到对应的mapper文件中的二级缓存中。缓存可以减少数据库的访问,提高性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

codewen77

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

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

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

打赏作者

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

抵扣说明:

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

余额充值