要在 MyBatis 中开启二级缓存,可以按照以下步骤操作:

1. 配置全局开启缓存
在 MyBatis 的全局配置文件中,确保启用了缓存功能。

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

2. 在映射文件中配置二级缓存
需要在具体的 Mapper 对应的 XML 文件中添加 <cache> 标签,以开启对应表的二级缓存。

<mapper namespace="com.example.mapper.UserMapper">
    <cache />
</mapper>
  • <cache /> 默认使用 MyBatis 内置的 PerpetualCache 和 LRU(最近最少使用)算法管理缓存。
  • 如果需要自定义缓存策略,可以通过 <cache> 标签的属性进行配置,例如:
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true" />
  • eviction:缓存回收策略(默认 LRU),支持 FIFOSOFTWEAK 等。
  • flushInterval:刷新间隔时间,单位为毫秒。
  • size:缓存对象数目上限。
  • readOnly:是否只读,true 表示只读,性能更好;false 表示可读写。

3. Mapper 接口或类需要是单实例的
确保 Mapper 接口或类是单例(默认情况下符合此要求),以保证缓存的一致性。

4. 配置对象的序列化
二级缓存存储的数据必须是可序列化的,因此需要让与之关联的实体类实现 Serializable 接口。

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;

    // Getters and setters
}

5. 测试二级缓存生效
确保 SQL 会话结束后,查询数据时命中缓存。例如:

try (SqlSession session1 = sqlSessionFactory.openSession()) {
    UserMapper mapper1 = session1.getMapper(UserMapper.class);
    System.out.println(mapper1.selectUserById(1)); // 第一次查询,存入二级缓存
    session1.close();
}

try (SqlSession session2 = sqlSessionFactory.openSession()) {
    UserMapper mapper2 = session2.getMapper(UserMapper.class);
    System.out.println(mapper2.selectUserById(1)); // 第二次查询,直接命中缓存
}

注意事项

  1. 二级缓存是基于 namespace 级别的,每个 Mapper 独立维护其缓存数据。
  2. 如果需要跨 Mapper 共享缓存,建议使用第三方缓存框架(如 Ehcache 或 Redis)集成 MyBatis。
  3. 配置了二级缓存后,updatedelete 等操作会自动清空缓存,确保数据一致性。

通过上述步骤,便可成功开启和配置 MyBatis 的二级缓存功能。