mybatis一级缓存二级缓存区别
时间: 2025-07-01 13:56:37 浏览: 5
### 一级缓存与二级缓存的区别
MyBatis 中的一级缓存和二级缓存是用于提高数据库查询性能的重要机制,它们在作用范围、生命周期以及数据共享能力等方面存在显著区别。
#### 作用范围
- **一级缓存** 是 `SqlSession` 级别的缓存,默认情况下是开启的。它只能在同一个 `SqlSession` 内部被访问,这意味着一旦该 `SqlSession` 关闭或提交事务(执行了插入、更新或删除操作),其中的所有缓存条目都将被清除。
- **二级缓存** 是 `SqlSessionFactory` 级别的缓存,它的作用范围更广,可以跨多个 `SqlSession` 共享。只有当配置为使用二级缓存并且对应的 Mapper 明确启用了二级缓存时,才会生效。二级缓存对于整个应用来说是一个全局的缓存,只要 `SqlSessionFactory` 没有被关闭,缓存中的数据就会一直存在[^1]。
#### 生命周期
- **一级缓存** 的生命周期与 `SqlSession` 相同。每当创建一个新的 `SqlSession` 实例时,都会有一个新的独立的一级缓存;而当这个 `SqlSession` 被关闭或者提交了事务后,其关联的一级缓存也会随之销毁[^2]。
- **二级缓存** 的生命周期则与 `SqlSessionFactory` 一致。即使所有的 `SqlSession` 都已经关闭,只要 `SqlSessionFactory` 还没有被关闭,那么二级缓存仍然有效,并且可以在后续打开的新 `SqlSession` 中继续使用[^3]。
#### 数据共享能力
- 在单个 `SqlSession` 内部,一级缓存能够有效地减少重复查询,但如果涉及到多个 `SqlSession` 或者分布式环境下的数据读取,则无法保证数据的一致性,因为每个 `SqlSession` 拥有自己的私有一级缓存。
- 二级缓存解决了这一问题,它允许不同 `SqlSession` 之间共享相同的缓存数据。特别是当多个用户同时访问相同的数据时,通过二级缓存可以降低对数据库的压力,提升系统的整体性能[^4]。
#### 查询顺序
当启用二级缓存并执行 SELECT 查询时,MyBatis 会按照以下顺序尝试获取数据:
1. 首先检查二级缓存中是否存在所需的数据。
2. 如果二级缓存中没有找到相关数据,则转向当前 `SqlSession` 的一级缓存进行查找。
3. 若两级缓存均未命中,则最终会向数据库发起查询请求以获取最新的数据[^5]。
这种层次化的缓存策略有助于优化应用程序的响应时间和资源利用率,同时也确保了尽可能地返回最新版本的数据。
### 示例代码:配置 MyBatis 使用 Redis 作为二级缓存
```xml
<!-- 添加 Redis 缓存依赖 -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
<!-- 配置 Mapper 文件 -->
<mapper namespace="com.example.UserMapper">
<!-- 启用 Redis 作为二级缓存 -->
<cache type="org.mybatis.caches.redis.RedisCache" />
</mapper>
```
此外,还需要提供一个 `redis.properties` 文件来指定连接参数,例如主机地址、端口号等信息。
---
阅读全文
相关推荐


















