Mybatis-plus缓存机制
一,介绍
MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,提供了更便捷的CRUD操作和其他功能。与MyBatis相比,MyBatis-Plus并没有引入自己的缓存机制,而是直接使用了MyBatis的缓存机制。
在MyBatis中,缓存分为一级缓存和二级缓存。
- 一级缓存:一级缓存是SqlSession级别的缓存,它默认是开启的。当查询操作执行时,查询的结果会被缓存在SqlSession的内部数据结构中。如果后续再次执行相同的查询,MyBatis会先检查一级缓存中是否存在结果,如果存在则直接返回缓存的结果,而不会再次执行SQL语句。一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,一级缓存也会被清空。
- 二级缓存:二级缓存是Mapper级别的缓存,它可以被多个SqlSession共享。当一个查询执行完毕后,查询的结果会被缓存到二级缓存中。当后续其他SqlSession执行相同的查询时,MyBatis会先检查二级缓存中是否存在结果,如果存在则直接返回缓存的结果,而不会再次执行SQL语句。二级缓存的生命周期与应用程序的整个生命周期相同,当应用程序关闭时,二级缓存才会被清空。
需要注意的是,二级缓存默认是关闭的,需要在MyBatis的配置文件中进行配置才能启用。同时,为了保证数据的一致性,MyBatis对于更新操作(如插入、更新、删除)会自动清空相关的二级缓存。
总结起来,MyBatis-Plus并没有引入自己的缓存机制,而是直接使用了MyBatis的一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,而二级缓存是Mapper级别的缓存。开发者可以根据具体的需求来选择是否启用和配置二级缓存。
二,一级缓存
MyBatis-Plus并没有引入自己的一级缓存机制,而是直接使用了MyBatis的一级缓存。一级缓存是MyBatis中默认开启的,它是基于SqlSession级别的缓存,用于缓存查询操作的结果。
在MyBatis中,一级缓存的实现方式如下:
- SqlSession级别的缓存:每个SqlSession对象都有一个独立的一级缓存。当执行查询操作时,查询的结果会被缓存到当前SqlSession对象的一级缓存中。
- 缓存结构:一级缓存使用一个HashMap来存储查询结果。HashMap的键是查询的SQL语句和参数的组合,值是查询的结果对象。
- 缓存命中:当执行查询操作时,MyBatis会先检查当前SqlSession对象的一级缓存中是否存在相同的查询(相同的SQL语句和参数),如果存在则直接返回缓存的结果,而不会再次执行SQL语句。
- 缓存失效:一级缓存的生命周期与SqlSession对象相同。当SqlSession对象执行更新操作(如插入、更新、删除)时,会自动清空一级缓存,以保证数据的一致性。
需要注意的是,一级缓存是基于SqlSession对象的,不同的SqlSession对象之间的缓存是相互独立的。如果多个SqlSession对象同时操作同一份数据,它们之间的一级缓存是不共享的,可能会导致数据不一致的情况。
对于一级缓存的控制,MyBatis提供了以下几种方式:
- 默认开启:一级缓存在MyBatis中是默认开启的,无需额外配置。
- 手动清空:可以通过调用SqlSession的
clearCache()方法手动清空一级缓存。
- 配置禁用:可以在MyBatis的配置文件中通过设置
localCacheScope属性来禁用一级缓存。将localCacheScope设置为STATEMENT即可禁用一级缓存,每次查询都会强制刷新缓存。
总结起来,MyBatis-Plus并没有引入自己的一级缓存机制,而是直接使用了MyBatis的一级缓存。一级缓存是基于SqlSession级别的缓存,通过HashMap存储查询结果,可以提高查询性能。一级缓存是默认开启的,开发者可以通过手动清空或配置禁用的方式进行控制。
三,二级缓存
MyBatis-Plus并没有引入自己的二级缓存机制,而是直接使用了MyBatis的二级缓存。二级缓存是Mapper级别的缓存,用于缓存查询操作的结果。
在MyBatis中,二级缓存的实现方式如下:
- 配置启用:为了启用二级缓存,需要在MyBatis的配置文件中进行相应的配置。在
标签中添加标签,并设置type属性为合适的缓存实现类,如org.apache.ibatis.cache.impl.PerpetualCache。
- 缓存结构:二级缓存使用一个HashMap来存储查询结果。HashMap的键是查询的SQL语句和参数的组合,值是查询的结果对象。
- 缓存命中:当执行查询操作时,MyBatis会先检查二级缓存中是否存在相同的查询(相同的SQL语句和参数),如果存在则直接返回缓存的结果,而不会再次执行SQL语句。
- 缓存失效:二级缓存的生命周期与应用程序的整个生命周期相同。当执行更新操作(如插入、更新、删除)时,MyBatis会自动清空相关的二级缓存,以保证数据的一致性。
需要注意的是,二级缓存默认是关闭的,需要在MyBatis的配置文件中进行配置才能启用。
对于二级缓存的控制,MyBatis提供了以下几种方式:
- 默认配置:可以使用MyBatis的默认配置来启用二级缓存。在MyBatis的配置文件中,设置
即可启用二级缓存。
- 显式配置:可以在Mapper接口或XML文件中使用
标签来显式配置二级缓存。在标签中可以设置缓存的实现类、缓存的大小、缓存的过期时间等属性。
- 注解配置:可以使用
@CacheNamespace注解在Mapper接口上配置二级缓存。通过注解的方式可以灵活地控制缓存的行为。
总结起来,MyBatis-Plus并没有引入自己的二级缓存机制,而是直接使用了MyBatis的二级缓存。二级缓存是Mapper级别的缓存,可以提高查询性能。二级缓存默认是关闭的,需要在MyBatis的配置文件中进行配置才能启用,并可以通过默认配置、显式配置或注解配置的方式进行控制。
四,一级缓存和二级缓存的差异和关系
一级缓存和二级缓存是MyBatis中两种不同级别的缓存机制,它们有一些差异和关系。
- 级别差异:
- 一级缓存(SqlSession级别):一级缓存是默认开启的,它是基于SqlSession对象的缓存,用于缓存单个SqlSession中的查询结果。
- 二级缓存(Mapper级别):二级缓存是可选的,需要手动进行配置启用,它是基于Mapper接口的缓存,用于缓存多个SqlSession之间的查询结果。
- 范围差异:
- 一级缓存:一级缓存的作用范围是在同一个SqlSession中。当执行查询操作时,查询的结果会被缓存在当前SqlSession对象中,其他相同的查询可以直接从缓存中获取结果。
- 二级缓存:二级缓存的作用范围是在多个SqlSession之间共享。当执行查询操作时,查询的结果会被缓存在一个共享的缓存区域中,其他SqlSession可以直接从缓存中获取结果。
- 生命周期差异:
- 一级缓存:一级缓存的生命周期与SqlSession对象相同。当SqlSession对象执行更新操作(如插入、更新、删除)时,会自动清空一级缓存,以保证数据的一致性。
- 二级缓存:二级缓存的生命周期与应用程序的整个生命周期相同。当执行更新操作时,MyBatis会自动清空相关的二级缓存,以保证数据的一致性。
- 关系:
- 二级缓存是建立在一级缓存之上的。当一个SqlSession执行查询操作时,如果命中了一级缓存,则直接返回缓存的结果;如果没有命中一级缓存,则会去二级缓存中查找结果。如果二级缓存中存在相同的查询结果,则返回缓存的结果;如果二级缓存中不存在结果,则执行数据库查询,并将结果放入一级缓存和二级缓存中。
需要注意的是,一级缓存和二级缓存是独立的,它们的数据存储结构和缓存命中策略也不同。一级缓存是基于SqlSession对象的,缓存的数据只在当前SqlSession中有效;而二级缓存是基于Mapper接口的,缓存的数据在多个SqlSession之间共享。
在使用MyBatis时,可以根据具体的需求和场景选择是否启用二级缓存,以及合理使用一级缓存和二级缓存,以提高查询性能和减少数据库访问。
五,总结
Mybatis-plus并没有引入自己的缓存机制,而是直接使用了MyBatis的一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。一级缓存是默认开启的,通过HashMap存储查询结果,可以提高查询性能。二级缓存默认是关闭的,需要在MyBatis的配置文件中进行配置才能启用。二级缓存是基于Mapper接口的,缓存的数据在多个SqlSession之间共享。一级缓存和二级缓存是独立的,它们的数据存储结构和缓存命中策略也不同。在使用MyBatis时,可以根据具体的需求和场景选择是否启用二级缓存,以及合理使用一级缓存和二级缓存,以提高查询性能和减少数据库访问。