MyBatis 一级缓存默认开启,是 session 级别。如果要禁用一级缓存,就要设置为 statement 级别,即:

<setting name="localCacheScope" value="SESSION"/>
//STATEMENT
mybatis:configuration:local-cache-scope: session  //statement 一级缓存cache-enabled: false  //这里是二级缓存

原理其实很简单,可以看 org.apache.ibatis.executor.BaseExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql) 方法(我个人猜测是之前没设计好的临时措施):

@Overridepublic <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());if (closed) {throw new ExecutorException("Executor was closed.");}if (queryStack == 0 && ms.isFlushCacheRequired()) {clearLocalCache();}List<E> list;try {queryStack++;list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;if (list != null) {handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);} else {list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);}} finally {queryStack--;}if (queryStack == 0) {for (DeferredLoad deferredLoad : deferredLoads) {deferredLoad.load();}// issue #601deferredLoads.clear();if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {// issue #482//statement级别直接clearclearLocalCache();}}return list;}

在网上看到还有一种可以禁用到单个 Mapper 的方式:

禁用一级缓存:mybatis没有提供一级缓存的启用、禁用开关,但在Mapper文件对应的语句中增加flushCache="true"可以达到实际禁用一级缓存的效果,一般同时还会加上useCache="false",以便关闭二级缓存

References

  • springboot+mybatis一级缓存启用/禁用问题_NongYeting的博客-CSDN博客_springboot关闭mybatis缓存

禁用 MyBatis 一级缓存相关推荐

  1. SpringBoot关闭MyBatis一级缓存的方法

    原文网址:SpringBoot关闭MyBatis一级缓存的方法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍SpringBoot关闭MyBatis一级缓存的方法. 备注 一级缓存只有在开启了 ...

  2. Mybatis一级缓存,二级缓存的实现就是这么简单

    介绍 又到了一年面试季,所以打算写一点面试常问的东西,争取说的通俗易懂.面试高级岗,如果你说熟悉Mybatis,下面这些问题基本上都会问 Mybatis插件的实现原理? 如何写一个分页插件? Myba ...

  3. Mybatis一级缓存、二级缓存

    一级缓存:SqlSession mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求,那么直接从内存中读数数据而不 ...

  4. MyBatis】MyBatis一级缓存和二级缓存

    转载自  MyBatis]MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存.一级缓存的作用域默认是一个SqlSe ...

  5. Mybatis一级缓存和二级缓存 Redis缓存

    一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对 ...

  6. 一文彻底读懂优秀开源产品MyBatis一级缓存设计!

    孙玄 奈学教育CEO 读完需要 3 分钟 速读仅需 1 分钟 孙玄, 现任奈学教育科技创始人&CEO ,毕业于浙大,前百度资深研发工程师.前 58 集团技术委员会主席/高级系统架构师到前转转公 ...

  7. java 一级缓存,MyBatis一级缓存避坑完全指南

    一级缓存概念 当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象.那么一个SqlSession的生命周期即对应于 ...

  8. 458、Java框架112 -【MyBatis - 一级缓存、二级缓存】 2020.12.28

    目录 0.一级缓存 1.在一个Session里查相同id的数据 2.在不同Session里查相同id的数据 3.二级缓存 4.基于前一个知识点 5.观察无二级缓存 6.启动二级缓存 7.在Catego ...

  9. 细说Mybatis一级缓存、二级缓存以及mybatis获取mapper的面向接口编程思想(Mapper接口动态代理实现原理)(二)

    上一章和大家分享了Mybatis一级缓存和二级缓存,本章将继续和大家分享Mapper接口动态代理实现原理,按照国际惯例,先看源码,然后结合原理,写一个自己的小demo,从理论到实战,真正掌握面向接口编 ...

最新文章

  1. mysql查询数字比字符串快,与字符串相比,MySQL在where子句中使用数字更快吗?
  2. ESXI使用记录---安装vSphere(VCSA)
  3. git上传超过100m大文件
  4. c语言类型名占字节,在C语言中,不同类型数据所占字节数
  5. 数学--数论--随机算法--Pollard Rho 大数分解算法 (带输出版本)
  6. Cascader 级联选择器
  7. JSON serializing and deserializing using JSON.NET
  8. 阿里云构建Jenkins服务
  9. 用汇编的眼光看C++(之算术符重载陷阱)
  10. web.config的问题
  11. CentOS下gitlab迁移和升级
  12. Java 学习路线一条龙版
  13. 工具----10、Backtrack的安装
  14. IGBT基本工作原理及IGBT的作用是什么?
  15. SPSS如何验证是否符合正态分布
  16. SXF python
  17. C 程序设计语言——第七章练习题
  18. Wordpress 网站设计入门 把Wordpress放在一个独立子目录下
  19. 提高数据库查询效率的八个方法
  20. 解决video更多选项按钮点击无反应以及操控video标签的控制按钮

热门文章

  1. C++--输出:保留两位小数
  2. c++序列号生成(注册码)附demo
  3. ASA 5520 防火墙SSH配置
  4. 看到记忆的印迹:神经科学家们如何定位、唤醒甚至偷换记忆
  5. 尤雨溪回应:为什么 Vue 在国际上越来越没影响力?
  6. 你必须知道的.NET(第2版)
  7. Camera ITS当中的test_exposure测试
  8. 搜索支持html5的浏览器,HTML5的浏览器支持情况
  9. Revit综合插件使用教程,综合插件主要的几个功能(下)
  10. Generation-A