一、先说结论
一级缓存是 `SqlSession` 级别的缓存,仅在同一个 `SqlSession` 中有效,用于提高单次会话内的查询效率;二级缓存则是 `SqlSessionFactory` 级别的缓存,多个 `SqlSession` 可以共享,减少数据库查询次数。一级缓存会在 `SqlSession` 关闭或执行增删改操作时失效,二级缓存则根据配置的清除策略或增删改操作来管理缓存有效性。
二、一级缓存
一级缓存(Local Cache)
- 存在范围:一级缓存是 SqlSession 级别的缓存,即缓存的数据仅在同一个 SqlSession 中有效。
- 缓存位置:一级缓存存在于 SqlSession 对象中。
- 作用范围:同一个 SqlSession 对象中进行的多次相同查询会直接从缓存中取数据,而不需要再次查询数据库。
- 失效条件:
- SqlSession 对象关闭:一旦 SqlSession 对象关闭,一级缓存中的数据会被清空。
- 调用 clearCache 方法:在 SqlSession 上调用 clearCache 方法可以手动清空一级缓存。
- 增删改操作:当执行增删改操作时,一级缓存会被清空,以保证数据的一致性。
三、二级缓存
- 二级缓存是一个sqlSessionFactory将数据库查询数据序列化缓存在磁盘上。
- 缓存位置:二级缓存存在于命名空间(Mapper 映射文件)中。
- 作用范围:不同的 SqlSession 对象之间可以共享相同命名空间下的缓存数据,从而减少数据库查询次数。
- 失效条件:
- 配置清除策略:二级缓存可以配置清除策略,例如设置缓存过期时间或在特定的增删改操作后清空缓存。
- 增删改操作:与一级缓存类似,执行增删改操作后,二级缓存也会被清空。