MyBatis默认会启用缓存机制吗?如果需要启用,应该怎么做?

参考回答

MyBatis 默认情况下并不会启用二级缓存,但它会启用 一级缓存,并且一级缓存是默认开启的,开发者无需做任何配置。对于 二级缓存,如果需要使用,它是 可选的,需要在配置文件中显式启用。

启用二级缓存的步骤:

  1. mybatis-config.xml 配置文件中启用全局缓存
    mybatis-config.xml 文件中,<settings> 标签下的 cacheEnabled 配置项默认是 true,它表示是否启用缓存(一级缓存和二级缓存)。如果你需要启用缓存,确保该项值为 true

    <configuration>
       <settings>
           <!-- 启用全局缓存,默认为 true -->
           <setting name="cacheEnabled" value="true"/>
       </settings>
    </configuration>
    
  2. 在 Mapper 映射文件中启用二级缓存
    在每个 Mapper 文件的 <mapper> 标签中,加入 <cache> 标签来启用二级缓存。这个标签可以直接启用二级缓存,或者通过配置 type 属性来指定使用的缓存实现。

  • 默认启用二级缓存(使用 MyBatis 内置的缓存实现):

    “`xml
    <mapper namespace="com.example.UserMapper">
    <cache/>
    <select id="selectUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
    </select>
    </mapper>
    “`

  • 启用指定类型的缓存(例如使用 EHCache):

    “`xml
    <mapper namespace="com.example.UserMapper">
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    <select id="selectUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
    </select>
    </mapper>
    “`

  1. (可选)在 mybatis-config.xml 中配置缓存实现(如 EHCache 或其他)
    如果使用 EHCache 或其他外部缓存框架,需要在 MyBatis 配置文件中添加相应的依赖和配置。

    <configuration>
       <plugins>
           <plugin interceptor="org.mybatis.caches.ehcache.EhcacheCache"/>
       </plugins>
    </configuration>
    

详细讲解与拓展

1. 一级缓存的启用

MyBatis 的 一级缓存 是默认启用的,并且它与 SqlSession 的生命周期相关。也就是说,只要一个 SqlSession 没有关闭,查询的结果就会被缓存到一级缓存中。如果在同一个 SqlSession 中多次查询相同的数据,MyBatis 会直接从一级缓存中获取数据,而不需要再次查询数据库。

一级缓存的启用是隐式的,开发者无需做额外的配置。每次执行查询时,MyBatis 会先检查一级缓存,如果缓存中有数据,直接返回结果;否则,执行数据库查询并将结果存储到一级缓存中。

2. 二级缓存的启用

二级缓存是跨 SqlSession 的缓存,它可以共享多个 SqlSession 的缓存数据。不同于一级缓存,它是 可选的,并且需要显式启用。

  • 启用全局缓存:在 mybatis-config.xml 文件的 <settings> 部分,确保 cacheEnabled 设置为 true(默认已经是 true),表示开启缓存机制。这会影响一级缓存和二级缓存的工作。
    <configuration>
      <settings>
          <!-- 启用全局缓存 -->
          <setting name="cacheEnabled" value="true"/>
      </settings>
    </configuration>
    
  • 在 Mapper 中启用二级缓存:对于每个 Mapper 文件,需要通过 <cache> 标签显式启用二级缓存。如果没有该标签,二级缓存不会被使用。MyBatis 会使用 PerpetualCache 作为默认的缓存实现,除非你指定其他的缓存类型(例如使用 EHCacheRedis 等)。
    <mapper namespace="com.example.UserMapper">
      <!-- 启用二级缓存 -->
      <cache/>
      <select id="selectUserById" resultType="User">
          SELECT * FROM users WHERE id = #{id}
      </select>
    </mapper>
    

3. 配置外部缓存实现(如 EHCache 或 Redis)

如果你希望使用外部缓存框架(如 EHCacheRedis 等),你需要在配置文件中添加外部缓存的支持,并在 Mapper 文件中指定使用的缓存类型。

  • 使用 EHCache
    <mapper namespace="com.example.UserMapper">
      <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      <select id="selectUserById" resultType="User">
          SELECT * FROM users WHERE id = #{id}
      </select>
    </mapper>
    
    • 配置 EHCache
      你还需要在 mybatis-config.xml 中配置 EHCache 的支持,并确保已经在项目中引入了 EHCache 相关的依赖。
    <configuration>
        <plugins>
            <plugin interceptor="org.mybatis.caches.ehcache.EhcacheCache"/>
        </plugins>
    </configuration>
    
  • 使用 Redis
    MyBatis 不直接提供 Redis 的缓存支持,你需要自己实现一个 Cache 接口,或者使用第三方插件来集成 Redis。常见的做法是通过 JedisLettuce 来连接 Redis,并实现缓存的读取、写入、失效等操作。

4. 缓存清除与失效机制

  • 一级缓存:一级缓存会在 SqlSession 提交或回滚时清空。此外,当执行增、删、改操作时,一级缓存中的相关数据也会失效。

  • 二级缓存:二级缓存需要手动管理数据失效。通常,执行 insertupdatedelete 等修改操作时,会使相关缓存数据失效,保证缓存中存储的是最新的数据。对于外部缓存(如 Redis、EHCache 等),失效和更新策略通常由缓存框架自己提供。

5. 注意事项

  • 性能考虑:缓存机制能够显著提高系统性能,尤其是当查询频繁且数据不经常变动时,能够减少数据库的访问压力。然而,缓存可能会导致数据过时的问题,因此需要合理设计缓存的失效策略。

  • 缓存策略:在实际使用中,开发者可以根据业务场景设计合适的缓存策略。例如,使用 LRU(最近最少使用)缓存,或者设置缓存的过期时间等。

总结

  • 一级缓存:MyBatis 默认启用,它的作用范围仅限于当前 SqlSession,当 SqlSession 关闭时缓存会被清空。一级缓存默认开启,开发者不需要额外配置。
  • 二级缓存:需要显式启用,并且可以在每个 Mapper 文件中通过 <cache> 标签配置。二级缓存是跨 SqlSession 的缓存,可以通过配置不同的缓存实现(如 EHCacheRedis 等)来优化性能。
  • 启用二级缓存时,确保 mybatis-config.xml 文件中的 cacheEnabled 配置为 true,并且在每个 Mapper 文件中显式启用二级缓存。

发表评论

后才能评论