一、什么是 MyBatis 的一级和二级缓存?
- 一级缓存:
- 是 SqlSession 级别的缓存,也称为本地缓存。
- 存在于一个 SqlSession 的生命周期中,用于存储执行查询操作后的结果集。
- 二级缓存:
- 是 Mapper 级别的缓存,可以在多个 SqlSession 之间共享。
- 用于存储特定 Mapper 中的查询结果,不同的 SqlSession 可以从二级缓存中获取相同查询的结果。
二、为什么要有 MyBatis 的一级和二级缓存?
- 提高性能:
- 减少对数据库的访问次数,尤其是对于频繁执行的相同查询,直接从缓存中获取结果可以大大提高响应速度。
- 降低数据库的负载,避免数据库因为频繁的查询而过度消耗资源。
- 数据一致性考虑:
- 一级缓存由于只在单个 SqlSession 内有效,对于短时间内的连续查询可以保证数据的一致性。
- 二级缓存虽然可以在多个 SqlSession 之间共享,但需要注意在数据被修改时及时刷新缓存,以确保数据的准确性。
三、怎么用 MyBatis 的一级和二级缓存?
- 一级缓存(默认开启):
- 无需进行额外配置,MyBatis 在执行查询时会自动使用一级缓存。
- 当执行 DML 操作(插入、更新、删除)时,MyBatis 会自动清空当前 SqlSession 的一级缓存,以保证后续查询能获取到最新的数据。
- 二级缓存:
- 在 Mapper XML 文件中开启二级缓存,通过添加
<cache/>
标签。 - 可以配置二级缓存的属性,如缓存的大小、过期时间、刷新间隔等。例如:
- 在 Mapper XML 文件中开启二级缓存,通过添加
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
- 在实体类中实现
Serializable
接口,确保对象可以被序列化,以便在缓存中存储和读取。 - 注意在数据被修改时,及时刷新二级缓存以保证数据的一致性。可以通过设置
cache
属性的flushInterval
(刷新间隔)或者在执行 DML 操作后手动调用SqlSession
的clearCache()
方法来刷新特定 Mapper 的缓存。