mybatis的一级缓存、二级缓存
时间: 2025-05-24 11:04:40 浏览: 18
### MyBatis 一级缓存和二级缓存的工作原理及使用方法
#### 一、MyBats 一级缓存工作原理
MyBatis 的一级缓存是基于 `SqlSession` 的缓存机制,其作用范围仅限于单个 `SqlSession` 实例。当在一个 `SqlSession` 中执行相同 SQL 查询时,第一次查询的结果会被保存到缓存中[^5]。如果后续再次执行相同的查询操作(且未发生任何增删改操作),MyBatis 将直接从缓存中获取结果,而不是重新向数据库发起请求。
需要注意的是,在两次查询之间如果有针对同一表的增删改操作,则当前 `SqlSession` 的缓存会被清除,以确保下一次查询能够获得最新的数据。
以下是关于一级缓存的关键特性总结:
- **作用域**:局限于单一 `SqlSession`。
- **生命周期**:随着 `SqlSession` 关闭而结束。
- **自动管理**:无需额外配置即可生效。
#### 二、MyBatis 二级缓存工作原理
与一级缓存不同,MyBatis 的二级缓存是一个跨 `SqlSession` 的全局缓存机制,适用于整个应用层面或特定命名空间下的 Mapper 文件。它的主要目的是通过共享缓存数据进一步降低对数据库的压力并提高性能[^3]。
具体来说,二级缓存的作用范围可以覆盖整个 `Mapper` 或者整个 `SqlSessionFactory`。这意味着即使是在不同的 `SqlSession` 下,只要它们调用了属于同一个命名空间 (`namespace`) 的查询语句,就可以利用之前已经存储好的缓存内容[^4]。
为了启用二级缓存,开发者需要完成以下几个步骤:
1. 在核心配置文件 (通常是 mybatis-config.xml) 中设置 `<setting name="cacheEnabled" value="true"/>` 来开启全局缓存支持;
2. 配置目标 Mapper XML 文件中的 `<cache/>` 标签或者自定义更复杂的缓存策略;
3. 如果希望集成第三方缓存组件(比如 Redis 或 EHCache),还需要引入相应的依赖库并通过插件形式扩展功能。
值得注意的是,默认情况下二级缓存处于关闭状态,因此必须手动激活才能正常使用。
#### 三、代码示例
下面提供了一个简单的例子展示如何在项目里实际运用这两种类型的缓存:
```xml
<!-- 开启全局缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<mapper namespace="com.example.mapper.UserMapper">
<!-- 定义二级缓存 -->
<cache/>
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
```
以上片段展示了如何在 MyBatis 映射器中声明一个基本的二级缓存结构以及关联的选择查询语句。
#### 四、注意事项
尽管合理使用缓存有助于优化系统表现,但也可能带来一些潜在风险,例如一致性问题等。所以在设计阶段应当充分考虑业务场景需求,并权衡利弊做出最佳决策。
---
阅读全文
相关推荐


















