Mybatis的一级缓存可以通过flushCache="false"属性关闭?

本文详细介绍了MyBatis框架中的一级缓存机制,包括其工作原理、使用场景及特点。阐述了如何在执行相同查询语句时,利用一级缓存提高查询效率,避免重复数据库操作。

一级缓存
1.第一次查询(先到sqlSession中区看看有没有需要的记录,如果没有就去DB中查询,发出sql语句).
2.当执行查询方法时,就会写入一级缓存sqlSession(sqlSession就是一级缓存, HashMap(key–Value))
2,第二次查询,因为是执行相同查询语句,所以直接从一级缓存中获取数据,而发出sql语句去DB查询.

注意:当sqlSession执行增删改的时候,就会清空一级缓存

一级缓存特点
1.和二级缓存不同它不需要配置.默认开启
2.不得不用,无法剔除
3.无法管理一级缓存

flushCache=“false” 此标签不能关闭一级缓存,刷新缓存区

<think>嗯,用户问的是MyBatis中的一级缓存和二级缓存如何使用。我得先回忆一下这两个缓存的区别和用法。首先,一级缓存是SqlSession级别的,默认开启的,而二级缓存是Mapper级别的,需要手动配置。 那用户可能想知道如何配置和使用它们,以及注意事项。比如一级缓存不需要特别配置,但可能需要注意在同一个SqlSession中的查询才会命中缓存。而二级缓存需要在配置文件中开启,并且在Mapper XML里加上<cache/>标签。还要说明缓存的策略,比如LRU、FIFO等,以及如何控制缓存的刷新,比如执行insert、update、delete操作时会清空缓存。接下来,可能需要给出具体的代码示例,比如如何开启二级缓存,配置参数,以及如何避免缓存引起的问题,比如关闭一级缓存的情况。此外,还要提到二级缓存可能引发的脏读问题,特别是在分布式环境下,需要谨慎使用。 然后,用户可能还会关心什么时候使用缓存,如何管理缓存的失效,以及相关的配置选项。比如使用flushCache和useCache属性来控制个别语句的缓存行为。这部分需要详细说明,帮助用户理解如何在实际项目中应用。 最后,按照要求,要提出四个相关问题,可能包括一级缓存的作用域,如何禁用一级缓存,二级缓存的配置方式,以及缓存的优缺点。这些问题需要覆盖用户可能进一步想了解的内容,帮助他们深入理解MyBatis缓存机制。</think>MyBatis 中的一级缓存和二级缓存使用方式及原理如下: ### 一级缓存(Session 级别缓存) **使用方式**: 1. 默认开启,作用于 `SqlSession` 作用域 2. 自动生效,无需额外配置 3. 当执行 `commit()`、`close()` 或 `update` 操作时自动清除 ```java // 示例代码 SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 第一次查询数据库 User user1 = mapper.selectUserById(1); // 第二次从一级缓存获取(不查询数据库) User user2 = mapper.selectUserById(1); // 执行更新操作会清空缓存 mapper.updateUser(user1); sqlSession.commit(); // 第三次需要重新查询数据库 User user3 = mapper.selectUserById(1); } finally { sqlSession.close(); } ``` **注意事项**: - 相同 SQL 和参数才会命中缓存 - 不同 `SqlSession` 的缓存相互隔离 ### 二级缓存(Mapper 级别缓存) **使用方式**: 1. 需要手动开启配置 2. 作用于 `Mapper` 命名空间级别 3. 跨 `SqlSession` 共享缓存 **配置步骤**: 1. MyBatis 全局配置: ```xml <settings> <setting name="cacheEnabled" value="true"/> </settings> ``` 2. Mapper XML 配置: ```xml <mapper namespace="com.example.UserMapper"> <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/> </mapper> ``` **参数说明**: - `eviction`:缓存淘汰策略(LRU/FIFO/SOFT/WEAK) - `flushInterval`:自动刷新间隔(毫秒) - `size`:缓存对象数量上限 - `readOnly`:是否只读缓存 **代码使用**: ```java // 必须序列化实体类 public class User implements Serializable { // ... } // 不同 SqlSession 共享缓存 SqlSession session1 = sqlSessionFactory.openSession(); User user1 = session1.getMapper(UserMapper.class).selectUserById(1); session1.close(); // 必须关闭才会提交到二级缓存 SqlSession session2 = sqlSessionFactory.openSession(); User user2 = session2.getMapper(UserMapper.class).selectUserById(1); // 命中二级缓存 session2.close(); ``` ### 缓存控制 1. 完全禁用缓存(语句级别): ```xml <select id="selectUser" resultType="User" useCache="false"> SELECT * FROM user </select> ``` 2. 强制刷新缓存: ```xml <update id="updateUser" parameterType="User" flushCache="true"> UPDATE user SET name=#{name} WHERE id=#{id} </update> ``` ### 注意事项 1. 二级缓存可能导致脏读(建议在单机无并发场景使用) 2. 分布式环境需要配合 Redis 等集中缓存 3. 查询结果对象必须实现 `Serializable` 接口
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值