mybatis 一级缓存源码分析

使用场景

public static void main(String[] args) throws IOException {

    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();

    /**
     *一级缓存命中条件:
     * 1.sql 和参数必须相同
     * 2.必须是相同的statementId
     * 3.sqlSession必须相同(会话级别的缓存)
     * 4.RowBounds 返回行范围必须相同
     */
    ActivityMapper mapper = sqlSession.getMapper(ActivityMapper.class);
    ActivityEntity activity = mapper.getActivity(1);
    //SqlSession sqlSession1 = sqlSessionFactory.openSession();
    //ActivityMapper mapper1 = sqlSession1.getMapper(ActivityMapper.class);
    /**
     * 满足上面四个条件的前提条件下如何将缓存清除
     * 1.sqlSession.clearCache();
     * 2.未调用flushCache=true的查询
     * 3。未执行update
     *4。 缓存作用域不是STATEMENT——》将缓存作用域变小了,这种在子查询,嵌套查询中可以起作用
     */
    sqlSession.clearCache();
    ActivityEntity activity1 = mapper.getActivity(1);
    System.out.println(activity==activity1);
  }

在这里插入图片描述

源码分析

在这里插入图片描述
从上图可以看出来核心代码在query方法中,下面从query方法分析

org.apache.ibatis.executor.BaseExecutor#query

try {
      queryStack++;
      //缓存中获取数据
      list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
      if (list != null) {
        //缓存中存在数据的情况
        handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
      } else {
        //从数据库中获取
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
      }
    } finally {
      queryStack--;
    }



在这里插入图片描述
以上6种数据组成了缓存key

org.apache.ibatis.executor.BaseExecutor#queryFromDatabase


List<E> list;
    localCache.putObject(key, EXECUTION_PLACEHOLDER);
    try {
      //具体的Executor调用doQuery方法,查询数据库
      list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
    } finally {
      localCache.removeObject(key);
    }
    //填充到缓存中
    localCache.putObject(key, list);
    if (ms.getStatementType() == StatementType.CALLABLE) {
      localOutputParameterCache.putObject(key, parameter);
    }
    return list;

清除缓存调用的情况

调用update

在这里插入图片描述

配置flushCache

在这里插入图片描述

作用域设置为STATEMENT

在这里插入图片描述

执行commit

在这里插入图片描述

执行rollback

在这里插入图片描述

sqlSession 调用clearCache()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值