栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

手写mybatis(三):缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

手写mybatis(三):缓存

文末附有源码地址

博客为代码完成后才开始整理,展示的代码都是最终代码

介绍:

个人学习,代码写的不够好,有点乱
通过学习mybatis源码模拟实现Mybatis(在完善)
已实现:
crud(实现XML配置,注解配置写过一点,原理差不多不写了)、
事务、
数据库连接池、
动态sql(一部分,原理没问题了,以后有时间再完善)、
一级二级缓存

一、mybatis一级缓存

mybatis缓存分为一级、二级缓存。一级缓存就是 SqlSession 级别的缓存,而同一个 SqlSession 会有相同的一级缓存。
通过探究得到以下流程:
Salsession -> Defaultsqlsession -> Executor -> baseexecutor -> Perpetualcache
我们每次执行 update 方法时,都会先刷新一级缓存,因为是同一个 SqlSession, 所以是由同一个 Map 进行存储的,所以此时一级缓存会失效

二、一级缓存

前面的类我们已经写过,那最重要的是Perpetualcache,mybatis定义了一个Cache接口并让Perpetualcache实现这个接口。

public class PerpetualCache implements Cache {

    private final Map cache = new HashMap<>();

    @Override
    public String getId() {
        return null;
    }

    @Override
    public int getSize() {
        return cache.size();
    }

    @Override
    public void putObject(Object key, Object value) {
        cache.put(key, value);
    }

    @Override
    public Object getObject(Object key) {
        return cache.get(key);
    }

    @Override
    public Object removeObject(Object key) {
        return cache.remove(key);
    }

    @Override
    public void clear() {
        cache.clear();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Cache)) {
            return false;
        }

        Cache otherCache = (Cache) o;
        return getId().equals(otherCache.getId());
    }


}

其中属性map类型的cache便存放的是缓存数据。
缓存在Executor被使用

List cache = (List) localCache.getObject(resultSql);
            if (cache != null) {
                return cache;
            }
localCache.putObject(resultSql, list);
            if (configuration.isEnableCache()) {
                configuration.getPerpetualCache().putObject(resultSql, list);
            }

同一个sqlsession每次update都要清空缓存。

public int update(Mapper mapper, Object[] object) {
        localCache.clear();
        if (configuration.isEnableCache()) {
            configuration.clearPerpetualCache();
        }
}
三、mybatis二级缓存

mybatis二级缓存默认是不开启的,若要使用需手动开启。


	

mybatis有一个CachingExecutor ,在执行一级缓存之前先进行二级缓存的查询。二级缓存被多个sqlsession所共享。同一个命名空间(namespace) 语句,都影响着一个共同的 cache.
update操作会清除缓存,个人感觉二级缓存作用其实不大。
大致模仿实现略微和mybatis不同:

if (configuration.isEnableCache()) {
	List globalCache = (List) configuration.getPerpetualCache().getObject(resultSql);
          if (globalCache != null) {
              return globalCache;
          }
    }
    
  ...........
   ...........
   
 if (configuration.isEnableCache()) {
     configuration.getPerpetualCache().putObject(resultSql, list);
 }

学习参考

项目地址

github:https://github.com/Alice-175/Mybaits

gitee:https://gitee.com/alice-175/Mybaits

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号