一级缓存:
- 范围:一级缓存是基于 SqlSession 的本地缓存,与单个 SqlSession 相关联。
- 生命周期:一级缓存的生命周期是短暂的,仅在同一个 SqlSession 内有效。当在同一个 SqlSession 中执行相同的查询时,第一次查询的结果会被缓存下来,后续的相同查询会直接从缓存中获取,而无需再次访问数据库。
- 默认开启:一级缓存是 MyBatis 的默认缓存机制,无需额外的配置来开启或关闭。
二级缓存:
- 范围:二级缓存是基于 Mapper 的命名空间(namespace)级别的缓存,可以被多个 SqlSession 共享。
- 生命周期:二级缓存的生命周期是较长的,在同一个命名空间内的多个 SqlSession 中共享。当一个 SqlSession 执行查询并将结果放入二级缓存后,其他 SqlSession 可以直接从二级缓存中获取相同查询的结果,而无需访问数据库。
- 手动配置:二级缓存需要手动进行配置和开启。
以下是开启二级缓存的示例代码:
- 配置 MyBatis 的全局配置文件(mybatis-config.xml):
<!-- mybatis-config.xml -->
<configuration>
<settings>
<setting name="cacheEnabled" value="true" /> <!-- 开启二级缓存 -->
</settings>
</configuration>
- 在 Mapper 接口类上添加
@CacheNamespace
注解,开启二级缓存:
@CacheNamespace
public interface UserMapper {
// Mapper 方法
}
- 指定二级缓存的具体实现方式(可选):
<!-- mybatis-config.xml -->
<configuration>
<environments default="development">
<environment id="development">
<!-- 配置数据源等 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 数据源配置 -->
</dataSource>
<!-- 配置二级缓存的实现方式 -->
<cache type="org.apache.ibatis.cache.impl.PerpetualCache" />
<!-- 其他配置 -->
</environment>
</environments>
</configuration>
在上述示例中,@CacheNamespace
注解用于开启二级缓存。如果希望使用自定义的缓存实现方式,可以在配置文件中指定 <cache>
标签的 type
属性为自定义的缓存实现类。
在使用二级缓存时,被缓存的实体类需要实现 Serializable
接口,以支持对象的序列化和反序列化操作。