禁用 MyBatis 一级缓存
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 一级缓存相关推荐
- SpringBoot关闭MyBatis一级缓存的方法
原文网址:SpringBoot关闭MyBatis一级缓存的方法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍SpringBoot关闭MyBatis一级缓存的方法. 备注 一级缓存只有在开启了 ...
- Mybatis一级缓存,二级缓存的实现就是这么简单
介绍 又到了一年面试季,所以打算写一点面试常问的东西,争取说的通俗易懂.面试高级岗,如果你说熟悉Mybatis,下面这些问题基本上都会问 Mybatis插件的实现原理? 如何写一个分页插件? Myba ...
- Mybatis一级缓存、二级缓存
一级缓存:SqlSession mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求,那么直接从内存中读数数据而不 ...
- MyBatis】MyBatis一级缓存和二级缓存
转载自 MyBatis]MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存.一级缓存的作用域默认是一个SqlSe ...
- Mybatis一级缓存和二级缓存 Redis缓存
一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对 ...
- 一文彻底读懂优秀开源产品MyBatis一级缓存设计!
孙玄 奈学教育CEO 读完需要 3 分钟 速读仅需 1 分钟 孙玄, 现任奈学教育科技创始人&CEO ,毕业于浙大,前百度资深研发工程师.前 58 集团技术委员会主席/高级系统架构师到前转转公 ...
- java 一级缓存,MyBatis一级缓存避坑完全指南
一级缓存概念 当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象.那么一个SqlSession的生命周期即对应于 ...
- 458、Java框架112 -【MyBatis - 一级缓存、二级缓存】 2020.12.28
目录 0.一级缓存 1.在一个Session里查相同id的数据 2.在不同Session里查相同id的数据 3.二级缓存 4.基于前一个知识点 5.观察无二级缓存 6.启动二级缓存 7.在Catego ...
- 细说Mybatis一级缓存、二级缓存以及mybatis获取mapper的面向接口编程思想(Mapper接口动态代理实现原理)(二)
上一章和大家分享了Mybatis一级缓存和二级缓存,本章将继续和大家分享Mapper接口动态代理实现原理,按照国际惯例,先看源码,然后结合原理,写一个自己的小demo,从理论到实战,真正掌握面向接口编 ...
最新文章
- mysql查询数字比字符串快,与字符串相比,MySQL在where子句中使用数字更快吗?
- ESXI使用记录---安装vSphere(VCSA)
- git上传超过100m大文件
- c语言类型名占字节,在C语言中,不同类型数据所占字节数
- 数学--数论--随机算法--Pollard Rho 大数分解算法 (带输出版本)
- Cascader 级联选择器
- JSON serializing and deserializing using JSON.NET
- 阿里云构建Jenkins服务
- 用汇编的眼光看C++(之算术符重载陷阱)
- web.config的问题
- CentOS下gitlab迁移和升级
- Java 学习路线一条龙版
- 工具----10、Backtrack的安装
- IGBT基本工作原理及IGBT的作用是什么?
- SPSS如何验证是否符合正态分布
- SXF python
- C 程序设计语言——第七章练习题
- Wordpress 网站设计入门 把Wordpress放在一个独立子目录下
- 提高数据库查询效率的八个方法
- 解决video更多选项按钮点击无反应以及操控video标签的控制按钮