mybatis一级缓存二级缓存使用场景
时间: 2025-04-09 19:21:22 浏览: 23
<think>好的,我现在需要回答用户关于MyBatis一级缓存和二级缓存的使用场景、区别和适用情况的问题。首先,我需要回顾一下MyBatis的缓存机制,确保自己的理解正确。
根据用户提供的引用资料,一级缓存是默认开启的,作用域是SqlSession级别的。而二级缓存需要手动配置,作用域是Mapper级别的,可以被多个SqlSession共享。不过,用户提到了一些关键点,比如一级缓存在Spring Boot中默认可能无效,需要事务支持才能生效,而二级缓存在分布式环境下可能会有脏读问题,建议使用Redis等外部缓存来解决。
接下来,我需要整理两者的区别,包括作用域、存储结构、开启方式、失效机制和应用场景。比如,一级缓存的哈希表结构存储SQL语句和结果,而二级缓存是双向链表。同时,一级缓存在同一SqlSession内有效,而二级缓存跨SqlSession。用户可能关心它们的性能影响和适用情况,比如高并发或分布式环境下如何选择。
还要注意引用中的细节,比如一级缓存在Spring Boot中的问题,需要事务支持,否则可能因为每次使用不同的SqlSession而失效。此外,二级缓存的脏读问题在分布式系统中更明显,需要第三方缓存解决方案,如Redis。这些点都需要在回答中明确说明。
最后,生成相关问题时要围绕用户可能进一步询问的方向,比如性能调优、脏读处理、配置步骤、与第三方整合以及适用场景对比等。确保问题能够引导用户深入理解MyBatis缓存机制。</think>### MyBatis 一级缓存与二级缓存的对比分析
#### 一、核心区别
| **特性** | **一级缓存** | **二级缓存** |
|------------------|--------------------------------------------|--------------------------------------------|
| **作用域** | SqlSession 级别(默认开启) | Mapper/Namespace 级别(需手动配置) |
| **存储结构** | 哈希表(键为 SQL 语句,值为结果)[^3] | 双向链表(节点包含 SQL 语句和结果) |
| **开启方式** | 默认开启(可通过配置关闭) | 需在映射文件中添加 `<cache/>` 标签开启 |
| **失效机制** | 执行更新操作或关闭 SqlSession 时失效 | 执行更新操作或配置超时时间后失效 |
| **适用场景** | 单次请求内重复查询优化 | 跨请求的共享查询优化 |
---
#### 二、使用场景与注意事项
1. **一级缓存**
- **适用场景**
适用于短时间内同一 SqlSession 内重复执行相同 SQL 的查询,例如事务中的多次相同查询。
- **典型问题**
- 在 Spring Boot 中默认无效(需开启事务才能生效)[^4]
- 易产生脏读(无法感知其他 SqlSession 的更新)[^4]
- 建议设置为 `STATEMENT` 级别关闭,避免数据不一致
2. **二级缓存**
- **适用场景**
适用于跨 SqlSession 的频繁查询且数据更新较少的场景(如配置表、静态数据)。
- **典型问题**
- 分布式部署时本地缓存导致脏读(需用 Redis 等第三方缓存替换)[^2]
- 多表关联查询需配置 `<cache-ref>` 实现缓存共享
- 需注意缓存淘汰策略(如 LRU、FIFO)和序列化问题
---
#### 三、生产环境建议
1. **单机应用**
- 关闭一级缓存(设为 `STATEMENT`)
- 选择性开启二级缓存(仅对低频更新数据生效)
2. **分布式应用**
- 禁用默认二级缓存,改用 Redis 等分布式缓存
- 结合注解 `@CacheNamespace` 实现细粒度控制
---
#### 四、配置示例(二级缓存 + Redis)
```xml
<!-- Mapper.xml 中启用 Redis 缓存 -->
<cache type="org.mybatis.caches.redis.RedisCache"/>
```
```properties
# redis.properties
host=localhost
port=6379
```
需引入依赖:
```xml
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
```
---
§§
1. MyBatis 如何通过 Redis 实现分布式二级缓存?
2. 为什么 Spring Boot 中一级缓存默认无效?如何修复?
3. 多表联查时如何配置二级缓存避免脏数据?
4. MyBatis 缓存与 Spring Cache 整合的优缺点是什么?
5. 如何监控 MyBatis 缓存命中率以进行性能调优?
阅读全文
相关推荐


















