网站建设江门,台州做网站哪家好,app排名,织梦网站博客模板背景
想起前两年工作中因为二级缓存默认开启导致的问题#xff0c;完整的看了一个介绍 MyBatis 缓存机制的视频《MyBatis 缓存基础知识讲解》。
总计知识点#xff1a;
缓存的类型及开关这是个形同虚设的功能#xff0c;线上环境应该禁用缓存
MyBatis 缓存分类
MyBasit…背景
想起前两年工作中因为二级缓存默认开启导致的问题完整的看了一个介绍 MyBatis 缓存机制的视频《MyBatis 缓存基础知识讲解》。
总计知识点
缓存的类型及开关这是个形同虚设的功能线上环境应该禁用缓存
MyBatis 缓存分类
MyBasit 缓存类型如下
一级缓存SqlSession 级别的缓存每个 SqlSession 对象维护一个缓存集合多个 SqlSession 对象之间缓存不共享。二级缓存Mapper 级别的缓存多个 SqlSession 访问相同 Mapper 对象的时候共享该 Mapper 的缓存。项目中的 SqlSession 是单例还是多例
一级缓存原理 SQL 缓存的结构sql ID 参数还是 SQL 语句缓存的结果类型直接是游标还是 Java 结果集合缓存的刷新执行 增/删/该 方法之后都会刷新缓存。
二级缓存原理 相关知识 1、二级缓存的数据存储介质多种所以实体类需要实现序列化接口。 2、二级缓存与 SqlSession 无关。 3、MyBatisPlus 二级缓存默认是开启的
Mybatis 禁用缓存配置
首先MyBatis 没有提供全局的一级缓存的关闭配置需要在每个 Mapper 的 sql 语句中配置 flushCachetrue 禁用一级缓存例如
select idgetUserInfo flushCachetrue parameterTypeint resultTypexx.UserInfo
select xx
/select其次MyBatis-Plus 提供了二级缓存的开关配置 cache-enabled 默认开启
mybatis-plus:mapper-locations: classpath*:/mapper/${spring.datasource.type}/*.xml,classpath*:/mapper/public/*.xml#实体扫描多个package用逗号或者分号分隔type-aliases-package: com.xx.*.entityconfiguration:# 开启驼峰命名规则自动转换map-underscore-to-camel-case: true#注意单引号解决 Oracle参数为null时1111异常jdbc-type-for-null: null # 本模块依赖其他模块操作数据库的数据所以禁止缓存cache-enabled: false以前参与的一个项目中有两个模块是相互依赖的一个模块负责数据管理另一个模块查询它的数据使用数据库操作框架是 MyBatisPlus。
出现过一个问题就是另一个模块修改了数据后另一个模块监控到数据没有发生变化后来想到是框架缓存的问题cache-enabled: false 加上该配置就正确了。
总结
线上环境应该关闭 MyBatis 的缓存一级缓存在分布式环境中容易导致脏数据二级缓存是基于 namespace 的对于涉及到多表关联的语句时容易因为脏数据而得不到正确数据。
既然这个功能这么鸡肋为什么当初要设计它呢