码上敲享录 > Mybatis面试题 > MyBatis的一级缓存和二级缓存有什么区别?如何开启二级缓存?

MyBatis的一级缓存和二级缓存有什么区别?如何开启二级缓存?

上一章章节目录下一章 2023-07-16已有260人阅读 评论(0)

MyBatis的一级缓存和二级缓存是两种不同级别的缓存机制。


1. 一级缓存(Local Cache):

  - 一级缓存是MyBatis默认开启的缓存机制,它是SqlSession级别的缓存,同一个SqlSession内部多次查询同一条数据时,会直接从缓存中获取,避免了频繁的数据库访问。

  - 一级缓存是在SqlSession内部维护的一个HashMap对象,键是查询的SQL语句和参数的组合,值是查询到的结果对象。

  - 一级缓存的生命周期与SqlSession一致,当SqlSession关闭或进行提交、回滚操作时,一级缓存也会被清空。

  - 默认情况下,一级缓存是开启的,可以通过在Mapper XML配置文件中的select标签设置`useCache="false"`来关闭一级缓存。


2. 二级缓存(Second Level Cache):

  - 二级缓存是基于namespace级别的缓存机制,可以被多个SqlSession共享,适用于多个并发SqlSession的情况下。

  - 二级缓存需要手动开启,通过配置文件或代码进行设置。

  - 二级缓存使用的是一个独立的缓存对象,缓存在整个应用程序的生命周期内有效,跨越了SqlSession的范围。

  - 二级缓存遵循了最近最少使用(LRU)策略,当缓存空间不足时,会自动删除最久未使用的缓存对象。

  - 可以通过在Mapper XML配置文件中的cache标签设置`type="org.mybatis.caches.ehcache.EhcacheCache"`来选择二级缓存的实现方式,也可以使用其他第三方缓存库,如Redis等。


如何开启和配置二级缓存:

1. 配置文件方式:在MyBatis的配置文件(mybatis-config.xml)中添加以下内容来开启和配置二级缓存:


  ```xml

  <configuration>

      ...

      <settings>

          <!-- 开启二级缓存 -->

          <setting name="cacheEnabled" value="true"/>


          <!-- 配置二级缓存实现方式 -->

          <setting name="cacheImplementation" value="org.mybatis.caches.ehcache.EhcacheCache"/>

      </settings>

      ...

  </configuration>

  ```


2. 注解和Java代码方式:通过在Mapper接口上添加`@CacheNamespace`注解来开启二级缓存。可以通过`@CacheNamespaceRef`注解引用其他Mapper接口的缓存。


  ```java

  @CacheNamespace

  public interface UserMapper {

      ...

  }

  ```


  如果需要使用其他第三方缓存库,可以自定义实现`org.apache.ibatis.cache.Cache`接口,并在配置文件或注解中指定相应的缓存实现。


需要注意的是,一级缓存和二级缓存是并列的,二者之间互不影响,可以独立开启和关闭。一级缓存对于减少数据库访问、提高性能是非常有用的,而二级缓存对于减少跨SqlSession的重复查询是很有帮助的。在使用二级缓存时,需要合理考虑缓存对象的更新策略,避免数据不一致的问题。


0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交