mybatis一级缓存、二级缓存的原理

MyBatis 的缓存机制分为两个级别:一级缓存和二级缓存。这两种缓存机制都有助于提高数据访问效率,减少对数据库的直接请求次数,但它们的工作原理和适用场景有所不同。

一级缓存(Per-Executor Transactional Caches)

一级缓存也被称为“事务范围内的缓存”或者“执行器级别的缓存”。它是默认开启的,并且不需要任何额外配置。一级缓存的作用范围是在同一个 SqlSession 对象内,也就是说,在同一个 SqlSession 中执行的多个 SQL 查询可以共享缓存中的结果。

一级缓存的原理:

  1. 缓存存储位置:一级缓存存储在 SqlSession 实例中,每个 SqlSession 都有自己的缓存。

  2. 缓存策略:当第一次执行 SQL 查询时,查询结果会被存储在一级缓存中。后续如果执行相同的 SQL 查询,MyBatis 将首先检查一级缓存中是否存在相同的结果,如果存在,则直接从缓存中获取,避免了对数据库的再次访问。

  3. 缓存刷新:一级缓存会在以下几种情况下被清空或重置:

    • 当提交或回滚事务时。
    • 当执行任何更新操作(如 insert、update 或 delete)时。
    • 当关闭 SqlSession 时。

二级缓存(Application-wide Caches)

二级缓存也被称为“应用级别的缓存”,它的作用范围比一级缓存更广,可以在整个应用程序中共享。二级缓存允许在多个 SqlSession 实例之间共享缓存数据,这通常通过在映射文件中配置 <cache> 元素来启用。

二级缓存的原理:

  1. 缓存存储位置:二级缓存存储在映射器(Mapper)级别,即在每个命名空间(namespace)内维护一个缓存实例。

  2. 缓存策略:与一级缓存类似,二级缓存也会在首次执行 SQL 查询后存储结果。但是,二级缓存的数据可以在不同的 SqlSession 之间共享,只要这些 SqlSession 使用的是同一个 Mapper。

  3. 缓存刷新:二级缓存的刷新机制比一级缓存复杂。默认情况下,当执行更新操作时,相关的二级缓存会被清空。但是,可以通过配置二级缓存的 eviction 策略、flushInterval、readOnly 属性等来定制缓存行为。

  4. 配置:二级缓存需要在映射文件中显式地配置,可以设置缓存过期时间、缓存刷新间隔、缓存实现类等属性。

  5. 注意事项:为了保证数据的一致性和正确性,当使用二级缓存时,建议将实体类设计为不可变对象或者在更新数据后主动清空相关缓存。

总的来说,一级缓存和二级缓存分别在不同的层次提供了数据缓存功能,一级缓存侧重于单个会话内的性能优化,而二级缓存则着眼于整个应用层面的数据共享和性能提升。合理利用这两级缓存,可以显著提高基于 MyBatis 的应用程序的性能和响应速度。

posted @ 2024-06-30 17:58  使用D  阅读(5)  评论(0编辑  收藏  举报