MyBatis 中有两级缓存:一级缓存(本地缓存)和二级缓存(全局缓存)。
- 一级缓存(本地缓存):
- 默认情况下,MyBatis 开启了一级缓存。
- 一级缓存是在同一个 SqlSession 内部有效的缓存,它会缓存在同一个 SqlSession 中执行过的查询语句的结果对象。
- 当同一个 SqlSession 多次查询相同的 SQL 时,如果开启了一级缓存,则第一次查询会将结果放入缓存中,后续查询会直接从缓存中获取而不再访问数据库。
- 一级缓存的生命周期与 SqlSession 的生命周期一致,当 SqlSession 关闭时,一级缓存也会被清空。
- 二级缓存(全局缓存):
- 二级缓存是在多个 SqlSession 之间共享数据的缓存,它可以提高多个 SqlSession 之间的查询性能。
- 二级缓存默认是关闭的,在需要使用时需要进行配置。
- 二级缓存是基于命名空间(Mapper)级别的,在同一个命名空间内的多个 SqlSession 可以共享缓存数据。
- 当一个 SqlSession 执行查询并将结果放入二级缓存中后,其他 SqlSession 在执行相同的查询时,会从二级缓存中获取结果而不再访问数据库。
- 二级缓存的生命周期与应用程序的生命周期一致,在应用程序关闭之前,二级缓存会一直存在并且可以被多个 SqlSession 共享。
需要注意的是,由于二级缓存是跨 SqlSession 的,所以在对数据库进行修改(增加、修改、删除)操作时,MyBatis 会自动清空该命名空间下的所有二级缓存,以保证缓存数据的一致性。另外,由于缓存是存储在内存中的,过多或过大的使用缓存可能会占用较多的系统资源,因此在实际应用中需要根据具体情况来合理配置和使用缓存