首页  

mybatis关闭一级二级缓存     所属分类 mybatis 浏览量 337
一级缓存 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