mybatis一级缓存和二级缓存的作用和区别
时间: 2025-05-25 18:11:07 浏览: 14
### MyBatis 一级缓存与二级缓存的作用与区别
#### 一、MyBatis 一级缓存的作用
MyBatis 的一级缓存主要作用在于提升单个 `SqlSession` 范围内的查询效率。当同一个 `SqlSession` 执行多次相同 SQL 查询时,如果数据未被修改,则可以直接从缓存中获取结果,无需再次访问数据库[^1]。
- **特点**:
- 基于 `SqlSession` 实现。
- 数据仅限当前 `SqlSession` 使用,无法跨会话共享。
- 自动维护,开发者无需额外配置即可启用。
- **局限性**:
- 如果 `SqlSession` 关闭或提交事务后,一级缓存会被清空[^4]。
- 不适用于分布式场景或多线程环境下的数据共享需求。
```java
// 示例:同一 SqlSession 下的一级缓存生效
try (SqlSession session = sqlSessionFactory.openSession()) {
User user1 = session.selectOne("getUserById", 1);
User user2 = session.selectOne("getUserById", 1); // 此次查询命中一级缓存
}
```
---
#### 二、MyBatis 二级缓存的作用
MyBatis 的二级缓存旨在进一步优化性能,支持多个 `SqlSession` 共享缓存数据。它通常应用于频繁读取且不常变化的数据表,能够显著降低数据库压力[^3]。
- **特点**:
- 基于 Mapper 文件的命名空间 (`namespace`) 配置。
- 支持自定义实现缓存策略(如 Ehcache 或 Redis)。
- 多个 `SqlSession` 可以共享同一块缓存区域。
- **工作流程**:
- 第一次查询时,将结果存储至二级缓存。
- 后续同名查询优先从二级缓存加载数据,而非重新执行 SQL[^3]。
```xml
<!-- 开启二级缓存 -->
<cache />
<select id="selectUser" resultType="User">
SELECT * FROM users WHERE id = #{id};
</select>
```
---
#### 三、一级缓存与二级缓存的区别
| 特性 | 一级缓存 | 二级缓存 |
|--------------------|---------------------------------------------|---------------------------------------------|
| **范围** | 单个 `SqlSession` | 多个 `SqlSession` |
| **生命周期** | 随 `SqlSession` 生命周期结束而清除 | 存活时间较长,可持久化 |
| **共享能力** | 不支持跨会话共享 | 支持跨会话共享 |
| **默认行为** | 默认开启 | 默认关闭 |
| **适用场景** | 小规模、短周期操作 | 大规模、高频率读取操作 |
需要注意的是,在 Spring 整合 MyBatis 场景下,由于每次请求都会创建新的 `SqlSession`,因此一级缓存的实际效果有限[^5]。
---
### 总结
一级缓存和二级缓存均是为了减少数据库交互次数而设计的机制。前者专注于单一 `SqlSession` 内部的高效利用;后者则扩展了缓存边界,允许不同会话间共享资源。合理选择两者取决于具体业务需求以及系统的并发特性。
---
阅读全文
相关推荐
















