MyBatis是一个持久层框架,它提供了一级缓存和二级缓存来提高数据库操作的性能。下面是一级缓存和二级缓存的区别理解、画图和知识点总结:
一级缓存:
- 一级缓存是MyBatis默认开启的缓存层,它是SqlSession级别的缓存,也就是说同一个SqlSession中的多次查询会使用同一个缓存。
- 一级缓存是在内存中实现的,它的生命周期与SqlSession相同。
- 当SqlSession执行查询时,查询的结果会被保存在一级缓存中,下次再执行相同的查询语句时,会直接从缓存中取结果,而不需要再次访问数据库。
- 一级缓存的失效条件包括:SqlSession关闭、手动清除缓存、增删改操作等。
- 一级缓存的范围是SqlSession级别的,不同的SqlSession之间无法共享缓存。
二级缓存:
- 二级缓存是MyBatis中的全局缓存,它是mapper级别的缓存,多个SqlSession可以共享同一个二级缓存。
- 二级缓存是在SqlSessionFactory的级别实现的,它的生命周期与应用程序的生命周期相同。
- 当SqlSession执行查询时,查询的结果会被保存在二级缓存中,下次再执行相同的查询语句时,会直接从缓存中取结果,而不需要再次访问数据库。
- 二级缓存的失效条件包括:SqlSessionFactory刷新、手动清除缓存、增删改操作等。
- 二级缓存的范围是mapper级别的,同一个namespace下的mapper可以共享二级缓存,不同的namespace之间无法共享缓存。
- 使用二级缓存需要在Mapper的配置文件中配置<cache>标签。
总结:
- 一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存。
- 一级缓存的生命周期是与SqlSession相同,二级缓存的生命周期是与应用程序相同。
- 一级缓存的范围是SqlSession级别的,二级缓存的范围是mapper级别的。
- 一级缓存的作用范围是在同一个SqlSession中,二级缓存的作用范围是在多个SqlSession中。
- 一级缓存是默认开启的,而使用二级缓存需要在Mapper的配置文件中进行配置。
以下是一级缓存和二级缓存的简单示意图:
+------------+ +----------------+
| SqlSession | ---------------->| DB |
| | | |
+----^-------+ +------+---------+
| |
| |
| |
| +-----------------+ |
+-------> | 一级缓存 | <-----+
+-----------------+
+-----------------------+ +----------------+
| SqlSessionFactory | | DB |
| | | |
+----^--------------+---+ +------+---------+
| |
| |
| |
| +-----------------+ |
+------> | 二级缓存 | <--------+
+-----------------+