Mybatis 二级缓存设计说明

只针对框架支持 Mybatis 二级缓存的设计进行说明,想深入了解 Mybatis 缓存原
理请阅读 Mybatis 缓存详细设计文档
1. Mybatis 缓存概要说明
一级缓存: 只是相对于同一个 SqlSession 而言。所以在参数和 SQL 完全一样的情
况下,我们使用同一个 SqlSession 对象调用一个 Mapper 方法,往往只执行一次
SQL 因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,以后再查询
的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession 都会取
出当前缓存的数据,而不会再次发送 SQL 到数据库,在没有配置的情况下,
Mybatis 默认开启一级缓存。
二级缓存:Application 级别的缓存,它可以提高对数据库查询的效率,以提高应用
的性能。SqlSessionFactory 层面上的二级缓存默认是不开启的,二级缓存的开启需
要进行配置,实现二级缓存的时候,MyBatis 要求返回的 POJO 必须是可序列化的。
也就是要求实现 Serializable 接口,配置方法很简单,只需要在映射的 XML 文件配
置就可以开启缓存了<cache/>。
分布式二级缓存:假设现在有两个服务器 1 和 2,用户访问的时候访问了 1 服务器,
查询后的缓存就会放在 1 服务器上,假设现在有个用户访问的是 2 服务器,那么他
在 2 服务器上就无法获取刚刚那个缓存,为了解決这个问题,就得找一个分布式的
缓存,专门用来存储缓存数据的,这样不同的服务器要缓存数据都往它那里存,取
缓存数据也从它那里取。
2. 后端开发框架二级缓存使用说明
1) Spring Boot 项目如果需要打开 Mybatis 二级缓存,需要在配置文件中增加配
置项:mybatis.configuration.cache-enabled=true
2) 缓存策略配置:配置文件中设置缓存最大容量 mybatis.cache.max-size=xxx 默
认值为 512,存活时间 mybatis.cache.ttl=xxx 默认值 86400 秒
3) 在需要启用缓存的主 mapper.xml 文件里增加
<cache type="com.sutpc.paas.core.mybatis.MybatisRedisCache"/>
MybatisRedisCache 类为框架提供的基于 redis 分布式缓存设计的 Cache
4) 如果同一个 namespace 下有多个 mapper 文件,增加的文件需要增加
<cache-ref namespace="com.sutpc.xxxx.xxxx.xxxx” />,这样才能达到缓存、删
除脏数据的效果。
5) 可以在 Mapper 的具体方法下设置对二级缓存的访问意愿:
<update id="save" parameterType="XX" flushCache="true" useCache="false">
</update>
如果没有配置 flushCache、useCache,那么默认是启用缓存的。
fushCache 默认为 false,表示任何时候语句被调用,都不会去清空本地缓存和
二级缓存。
useCache 默认为 true,表示会将本条语句的结果进行二级缓存。
在 insert、update、delete 语句时:flushCache 默认为 true,表示任何时候语
句被调用,都会导致本地缓存和二级缓存被清空。useCache 属性在该情况下
没有。update 的时候如果 flushCache="false”,则当你更新后,查询的数据还
是老的数据。
6) 代码生成器生成的 select 语句默认 useCache="false"不启用二级缓存,在于查
询条件过于灵活,缓存命中率低,所以不建议缓存。一般建议启用二级缓存的
查询都在***Ex-mapper.xml 中定义,具有一定入参限制的查询。
3. 注意事项
1) 只能在【只有单表操作】的表上使用缓存
不只是要保证这个表在整个系统中只有单表操作,而且和该表有关的全部操作必须
全部在一个 namespace 下。
针对一个表的某些操作不在他独立的 namespace 下进行。例如在 UserMapper.xml
中有大多数针对 user 表的操作。但是在一个 xxxMapper.xml 中,还有针对 user 单
表 的 操 作 。 这 会 导 致 user 在 两 个 命 名 空 间 下 的 数 据 不 一 致 。 如 果 在
UserMapper.xml 中做了刷新缓存的操作,在 xxxMapper.xml 中缓存仍然有效,如果
有针对 user 的单表查询,使用缓存的结果可能会不正确。更危险的情况是在
xxxMapper.xml 做了 insert,update,delete 操作时,会导致 UserMapper.xml 中的各种
操作充满未知风险。有关这样单表的操作可能不常见。但是你也许想到了一种常见
的情况。多表操作一定不能使用缓存。
2) 在可以保证查询远远大于 insert,update,delete 操作的情况下使用缓存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值