mybatis关闭一级二级缓存
所属分类 mybatis
浏览量 327
一级缓存 SqlSession 级别 ,SqlSession中再次执行相同SQL语句时,从缓存中获取结果
二级缓存 namespace/Mapper 级别
开启一级缓存的问题
如果不通过MyBatis修改数据,而是通过Navicat等工具,那么缓存中的数据不会被删除,导致MyBatis查到的还是老数据
MyBatis 的二级缓存不适应用于映射文件中存在多表查询的情况,
MyBatis 的二级缓存是基于 namespace 的,
多表查询语句所在的 namspace 无法感应到其他 namespace 中的语句对多表查询中涉及的表进行的修改,引发脏数据问题。
虽然可以通过 Cache ref 来解决多表的问题,但这样做的后果是,缓存的粒度变粗了,多个 Mapper namespace 下的所有操作都会对缓存使用造成影响。
生产环境建议关闭一二级缓存 ,只作为 ORM 框架使用就行
关闭一级缓存的方式
session.clearCache()
Mapper文件对应的语句中增加 flushCache="true"
statement 中设置 useCache="false" 禁用二级缓存 (注意是二级缓存)
MyBatis 一级缓存(MyBaits LocalCache)无法关闭,但有两种级别可选
session
在同一个 sqlSession 内,对同样的查询将不再查询数据库,直接从缓存中获取。
statement
每次查询结束都会清掉一级缓存,相当于禁用一级缓存
分布式环境下,将MyBatis的localCacheScope属性设置为STATEMENT,查询时清空一级缓存,
避免其他应用节点执行SQL更新语句后,本节点缓存得不到刷新而导致的数据一致性问题。
https://mybatis.org/mybatis-3/configuration.html#settings
localCacheScope SESSION | STATEMENT
MyBatis uses local cache to prevent circular references and speed up repeated nested queries.
By default (SESSION) all queries executed during a session are cached.
If localCacheScope=STATEMENT local session will be used just for statement execution,
no data will be shared between two different calls to the same SqlSession.
mybatis:
configuration:
cache-enabled: false #禁用二级缓存
local-cache-scope: statement #一级缓存指定为statement级别
上一篇
下一篇
小学生运动课
k8s面试知识点
拼音字母分类
Eureka 和 ZooKeeper 注册中心 区别
HTTPS加密过程
k8s SC PV PVC