一级缓存
- 定义与作用域:也叫本地缓存,是 SqlSession 级别的缓存。即在同一个 SqlSession 与数据库交互的过程中,查询到的数据会放在本地缓存里 。不同 SqlSession 间的缓存相互独立。
- 工作原理 :当发起查询请求时,SqlSession 先检查缓存中是否有对应数据,有则直接读取;没有就从数据库查询,再将查询结果存入一级缓存。不过,若 SqlSession 执行了增删改(commit 操作),为避免脏读,会清空缓存。
- 特点:默认开启,无需额外配置;缓存生命周期与 SqlSession 一致,SqlSession 关闭或提交事务后,缓存可能失效;作用范围小,仅在当前 SqlSession 内有效。
二级缓存
- 定义与作用域:也叫全局缓存,是基于 namespace 级别的缓存,一个 namespace 对应一个二级缓存。多个 SqlSession 操作同一个 Mapper(相同 namespace)的 sql 语句时,可共用二级缓存,实现了跨 SqlSession 的缓存 。
- 工作原理:当一个 SqlSession 关闭后,该会话一级缓存中的数据会被放入二级缓存。后续新的 SqlSession 查询相同数据,若二级缓存存在,就直接获取 。
- 开启方式:
- 在
mybatis-config.xml
配置文件中配置<setting name="cacheEnabled" value="true"/>
开启全局缓存。 - 在对应的 Mapper 映射文件中添加
<cache/>
标签。 - 使使用二级缓存的 POJO 类实现
Serializable
接口,以便缓存数据能序列化和反序列化。
- 在
- 特点:需手动开启和配置;缓存作用范围更广,能在多个 SqlSession 间共享;可自定义实现
cache
接口来拓展缓存功能,如使用第三方缓存框架(如 Ehcache)。
两者区别
- 作用域:一级缓存作用域是 SqlSession,二级缓存是 namespace(通常对应 Mapper) 。
- 开启方式:一级缓存默认开启,二级缓存需手动配置开启。
- 缓存生命周期:一级缓存随 SqlSession 的创建而存在,关闭或提交事务可能清空;二级缓存生命周期更长,只要应用不重启或未清空缓存,数据就可能一直存在。
- 数据共享:一级缓存仅在当前 SqlSession 内共享数据,二级缓存能在多个 SqlSession 间共享。
通常,在查询多、增删改少,且用户对查询结果实时性要求不高的场景中,可利用 MyBatis 二级缓存减少数据库访问,提升访问速度。