要在 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
),支持FIFO
、SOFT
、WEAK
等。 - 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)); // 第二次查询,直接命中缓存
}
注意事项
- 二级缓存是基于
namespace
级别的,每个Mapper
独立维护其缓存数据。 - 如果需要跨
Mapper
共享缓存,建议使用第三方缓存框架(如 Ehcache 或 Redis)集成 MyBatis。 - 配置了二级缓存后,
update
、delete
等操作会自动清空缓存,确保数据一致性。
通过上述步骤,便可成功开启和配置 MyBatis 的二级缓存功能。