Mybatis缓存机制详解

概述

MyBatis 是一个支持自定义 SQL、存储过程和高级映射的持久层框架,它提供了多种缓存机制来提升查询性能。在 MyBatis 中,缓存分为一级缓存(Local Cache)和二级缓存(Second Level Cache),同时还支持用户自定义缓存实现。

一级缓存(Local Cache)

一级缓存是 MyBatis 默认开启的缓存,它的作用域是 SqlSession 级别的。具体特点如下:

  • 作用范围:在同一个 SqlSession 内部,多次相同的查询会直接从缓存中获取结果,避免重复查询数据库,提高性能。
  • 生命周期:与 SqlSession 相关联,当 SqlSession 关闭时,一级缓存也会被清空。
  • 清空机制:任何一次增删改操作(insert、update、delete)都会导致一级缓存被清空,保证缓存数据的一致性。

一级缓存是 MyBatis 默认开启的,一般情况下无需特别配置。

二级缓存(Second Level Cache)

二级缓存是全局共享的缓存机制,可以跨 SqlSession 使用,它的作用范围是 Mapper 级别的。主要特点包括:

  • 作用范围:可以被多个 SqlSession 共享,同一个 namespace 下的多个 SqlSession 可以共享二级缓存中的数据。
  • 生命周期:与整个 namespace 相关联,当多个 SqlSession 执行相同的查询时,第一个 SqlSession 查询并将结果存入二级缓存,后续的 SqlSession 直接从缓存中获取。
  • 清空机制:由于是跨 SqlSession 共享的,增删改操作会引起该 namespace 下所有缓存数据的失效,但不会直接清空缓存,而是使缓存失效。
配置二级缓存

配置二级缓存需要在 MyBatis 的 XML 配置文件中进行:

<!-- 在每个 Mapper 的配置中开启二级缓存 -->
<mapper namespace="com.example.mapper.UserMapper">
    <cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
    
    <!-- 其他 Mapper 配置 -->
</mapper>

<!-- 在全局配置中开启二级缓存 -->
<settings>
    <setting name="cacheEnabled" value="true"/>
    <!-- 其他全局配置 -->
</settings>
自定义缓存

除了 MyBatis 提供的默认缓存实现外,你还可以自定义实现自己的缓存。自定义缓存需要实现 org.apache.ibatis.cache.Cache 接口,并注册到 MyBatis 的配置中。

自定义缓存的步骤如下:

  1. 实现 Cache 接口:实现自定义的缓存逻辑,需要实现以下方法:

    • String getId(): 获取缓存实例的唯一标识符。
    • void putObject(Object key, Object value): 将键值对存入缓存。
    • Object getObject(Object key): 根据键获取缓存中的值。
    • Object removeObject(Object key): 移除指定键对应的缓存项。
    • void clear(): 清空缓存。
    • int getSize(): 获取缓存中存储的项数。
  2. 配置缓存:将自定义的缓存类注册到 MyBatis 的配置中,可以在 XML 配置文件中指定或通过 Java 代码配置。

示例代码如下:

import org.apache.ibatis.cache.Cache;

public class MyCustomCache implements Cache {
    private String id;

    public MyCustomCache(String id) {
        this.id = id;
    }

    @Override
    public String getId() {
        return this.id;
    }

    @Override
    public void putObject(Object key, Object value) {
        // 自定义缓存逻辑
    }

    @Override
    public Object getObject(Object key) {
        // 自定义缓存逻辑
        return null;
    }

    @Override
    public Object removeObject(Object key) {
        // 自定义缓存逻辑
        return null;
    }

    @Override
    public void clear() {
        // 自定义缓存逻辑
    }

    @Override
    public int getSize() {
        // 自定义缓存逻辑
        return 0;
    }
}

注册自定义缓存到 MyBatis 配置中的方法取决于你是使用 XML 还是 Java 代码进行配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值