原文网址:SpringBoot关闭MyBatis一级缓存的方法_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍SpringBoot关闭MyBatis一级缓存的方法。
备注
一级缓存只有在开启了数据库事物并且处于一个被事物标注的方法下【直接或间接】才会生效。
为什么要关闭MyBatis一级缓存
默认情况下,MyBatis会开启一级缓存:对同样的查询将不再查询数据库,直接从缓存中获取。
开启一级缓存存在的问题:如果不通过MyBatis修改数据,而是通过Navicat等工具,那么缓存中的数据不会被删除,导致MyBatis查到的还是以前的数据。
关闭MyBatis一级缓存的方法
MyBatis没有提供一级缓存的启用、禁用开关,但在Mapper文件对应的语句中增加flushCache="true"可以达到实际禁用一级缓存的效果,一般同时还会加上useCache="false",以便关闭二级缓存。
下面讨论使用springboot配置的方式控制一级缓存。
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选:
session
在同一个 sqlSession 内,对同样的查询将不再查询数据库,直接从缓存中获取。
mybatis:
configuration:
cache-enabled: false #禁用二级缓存
local-cache-scope: session #一级缓存指定为session级别
statement
每次查询结束都会清掉一级缓存,实际效果就是禁用了一级缓存;
mybatis:
configuration:
cache-enabled: false #禁用二级缓存
local-cache-scope: statement #一级缓存指定为statement级别
实测
@Transactional(propagation = Propagation.REQUIRED)
public List<Users> getUsers() {
List<Users> usersList = usersMapper.selectByExample(new UsersExample()); //1
usersList = usersMapper.selectByExample(new UsersExample()); //2
return usersList;
}
A.一级缓存级别设置为session
在代码中1处,通过日志观察,打印出sql语句,未走缓存【此时缓存数据还不存在】;
在执行2处语句之前,通过数据库工具修改数据库记录并提交,继续执行程序后,通过日志观察,未打印出sql语句,获取的数据未体现出通过工具修改数据的变化,说明使用的是缓存中的数据;
B.一级缓存级别设置为statement
在代码中1处,通过日志观察,打印出sql语句,未走缓存【此时缓存数据还不存在】;
在执行2处语句之前,通过数据库工具修改数据库记录并提交,继续执行程序后,通过日志观察,打印出sql语句,且获取的数据也体现出通过工具修改数据的变化,说明未使用缓存中的数据;
结论:通过将一级缓存级别设置为statement,可以达到禁用一级缓存的效果。