SpringBoot关闭MyBatis一级缓存的方法

本文介绍如何在SpringBoot项目中通过配置禁用MyBatis的一级缓存,解决因外部工具修改数据导致缓存数据不一致的问题。

原文网址: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,可以达到禁用一级缓存的效果。

<think>好的,我需要帮用户解决在Spring Boot中关闭MyBatis二级缓存的配置方法。首先,用户之前已经询问过如何关闭一级缓存,现在转向二级缓存,所以需要明确两者的区别和配置方式。 根据引用资料,用户提供的引用[3]提到二级缓存是mapper级别的,默认需要手动开启。用户现在想关闭它,应该需要反向操作。通常MyBatis的二级缓存默认是关闭的,但可能用户的项目中已经启用了,所以需要确认如何正确关闭。 首先,查看引用[3]中的配置,提到开启二级缓存需要在application.properties中设置mybatis.configuration.cache-enabled=true。所以关闭的话,应该是将这个值设为false。但需要注意,根据MyBatis官方文档,cache-enabled的默认值其实是true,所以可能用户需要显式设置为false来禁用全局的二级缓存。 另外,用户可能在某些mapper.xml中单独配置了<cache/>标签,这样即使全局关闭,这些mapper可能仍然启用了缓存。因此,需要同时移除或注释掉这些mapper中的缓存配置。 还需要考虑是否需要在特定的SQL语句上设置useCache="false",以确保即使有缓存配置,某些查询也不会使用缓存。这可能作为补充配置。 需要验证配置是否生效,可以通过日志查看是否有缓存命中,或者执行查询后更新数据,观察是否立即反映结果,而不是从缓存中读取。 另外,用户可能关心关闭二级缓存后的影响,比如性能变化或脏数据问题,但用户的问题主要聚焦在配置方法,所以回答应重点放在步骤上,可能最后提到注意事项即可。 总结步骤应该是:1. 修改全局配置禁用二级缓存;2. 检查并移除mapper中的<cache>配置;3. 可选地在SQL语句上设置useCache属性;4. 验证配置生效。</think>### Spring Boot中关闭MyBatis二级缓存的配置方法 #### 一、全局关闭二级缓存 MyBatis的二级缓存默认**未开启**(需手动配置开启)[^3],但若项目中已启用,可通过以下方式全局关闭: 1. **修改`application.properties`配置** 添加以下配置项,禁用所有Mapper的二级缓存: ```properties # 关闭MyBatis二级缓存(全局生效) mybatis.configuration.cache-enabled=false ``` 2. **验证全局关闭效果** 检查Mapper.xml文件是否移除了`<cache/>`标签,否则部分Mapper可能仍启用缓存(需结合下一步操作)。 --- #### 二、移除Mapper级别的缓存配置 若特定Mapper.xml中已声明了缓存配置,需**手动删除相关代码**以彻底关闭: 1. **删除Mapper.xml中的`<cache>`标签** 例如: ```xml <!-- 删除以下缓存声明 --> <cache eviction="LRU" flushInterval="60000" size="512"/> ``` 2. **禁用单条SQL语句的缓存** 在需要实时数据的查询语句中添加`useCache="false"`: ```xml <select id="selectUser" resultType="User" useCache="false"> SELECT * FROM user WHERE id = #{id} </select> ``` --- #### 三、注意事项 1. **缓存作用范围** 二级缓存是`namespace`级别的,关闭后所有跨`SqlSession`的缓存共享将失效,确保数据一致性但牺牲部分性能[^3]。 2. **与一级缓存的区别** 关闭二级缓存**不影响一级缓存**(Session级别),若需完全禁用所有缓存,需同时: - 设置一级缓存为`STATEMENT`级别(关闭一级缓存) - 添加`flushCache="true"`到关键SQL语句中[^1] 3. **验证方法** 通过以下方式确认二级缓存关闭: - 重复查询同一数据时,观察日志中是否出现多次数据库访问 - 在更新操作后立即查询,验证数据是否实时更新 --- #### 四、完整配置示例 ```properties # application.properties # 关闭二级缓存(核心配置) mybatis.configuration.cache-enabled=false # 可选:关闭一级缓存(按需添加) mybatis.configuration.local-cache-scope=STATEMENT ``` ```xml <!-- UserMapper.xml --> <!-- 确保无<cache>标签 --> <select id="selectUser" resultType="User" useCache="false"> SELECT * FROM user WHERE id = #{id} </select> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值