mybatis的一级缓存

摘要:
此时,只有同一语句的子查询会命中缓存。一级缓存的键值总共有6个值,0是statementid,1和2是分页条件,3是sql,4是参数,和5是命中场景中的环境变量和参数=Null){//如果有缓存,请直接使用handleLocallyCachedOutputParameters;}否则{//没有缓存,请查询数据库列表=queryFromDatabase;}最后{queryStack--;}if{for{deferredLoad.load();}//issue#601deferredLoad。clear();如果{//issue#482clearLocalCache();//确定缓存范围。如果是语句,请直接删除缓存}}returnlist;}3.当spring继承mybatis时,一级缓存是否失败?

1、mybatis缓存使用场景

mybatis的一级缓存第1张

2、mybatis一级缓存命中场景

mybatis的一级缓存第2张

 当mybatis执行相关右边的操作时,均会执行clearCache()方法,清空对应缓存。

一级缓存的作用域默认是sqlsession,也就是同一个会话。但是也可以设置为statement级别缓存,此时级别变小了。此时只有同一个statement的子查询才会命中缓存。

只有满足左边条件才能命中缓存。

mybatis的一级缓存第3张

一级缓存的key值,总共有6个值,0是statementid,1、2是分页条件,3是sql,4是参数,5是环境变量和命中场景中的参数一一对应。

3、mybatis中缓存执行过程

mybatis的一级缓存第4张

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
    if (closed) {
      throw new ExecutorException("Executor was closed.");
    }
    if (queryStack == 0 && ms.isFlushCacheRequired()) {
      clearLocalCache();//对于嵌套查询只有第一次查询才会清空缓存,子查询不会清空缓存。
    }
    List<E> list;
    try {
      queryStack++;//嵌套查询使用   
      list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;//resulthandle不为空表示自定义了结果集处理函数,此时就不需要走缓存了,因为你要自定义处理缓存
      if (list != null) {//存在缓存,直接使用
        handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
      } else {//不存在缓存,查询数据库
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
      }
    } finally {
      queryStack--;
    }
    if (queryStack == 0) {
      for (DeferredLoad deferredLoad : deferredLoads) {
        deferredLoad.load();
      }
      // issue #601
      deferredLoads.clear();
      if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
        // issue #482
        clearLocalCache();//判断缓存作用域,如果是statment则直接删除缓存
      }
    }
    return list;
  }

3.spring继承mybatis时,一级缓存失效?

因为spring默认每一个查询都是一个事务,一个事务对应一个sqlsession会话,此时不在一个会话,当然不能命中。

只需要在查询中加上事务,就可以解决。

spring获取会话的数据结构。

mybatis的一级缓存第5张

private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    List<E> list;
    localCache.putObject(key, EXECUTION_PLACEHOLDER);//占位符,嵌套查询使用,防止死循环
    try {
      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;//返回结果
  }

免责声明:文章转载自《mybatis的一级缓存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python练习题3--foreclipse编辑工具小结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何构建可缓存站点

同一个资源保证URL的稳定性 URL是浏览器缓存机制的基础,所以如果一个资源需要在多个地方被引用,尽量保证URL是固定的。同时,比较推荐使用公共类库,比如Google Ajax Library等,有利于最大限度使用缓存 给Css、js、图片等资源增加HTTP缓存头,并强制入口Html不被缓存 对于不经常修改的静态资源,比如Css,js,图片等,可以设置一个...

使用Mybatis执行sql脚本

pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

微软的坑:Url重写竟然会引起IIS内核模式缓存不工作

万万没有想到!当初为了解决使用负载均衡时记录客户端IP地址的问题,在IIS URL Rewrite Module中增加了一条URL重写规则(详见迁入阿里云后遇到的Request.UserHostAddress记录IP地址问题):3 <rewrite> <allowedServerVariables> &...

比较全面的python类型转换

 前言提示: int(整形):a=1 str(字符串):a="asdsdf地方123" float(浮点):a="3.14150" bytes(字节包):a=b'xe2x82xac20' complex(复数):a=(34567+0j) list(列表):a=[1, 2, 3, '4', '五', 'liu'] set(集合):a={1,2,2,3,"4"...

springboot整合mybatis笔记

1首先创建一个springboot项目 创建项目的文件结构以及jdk的版本 选择项目所需要的依赖 之后点击finish,完成创建 2以下是文件结构 看一下啊pom.xml; <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.or...

学习Spring Boot:(十二)Mybatis 中自定义枚举转换器

https://blog.wuwii.com/springboot-12.html 前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载。 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org.apache.ibatis.type.EnumTypeHandler 和 ...