zoukankan      html  css  js  c++  java
  • mybatis基础流程_Mybatis的缓存

    mybatis基础流程_Mybatis的缓存

    mybatis提供了缓存机制, 分为一级缓存和二级缓存,其中一级缓存默认开启,二级缓存默认关闭

     1.  先聊一下一级缓存. ,默认此时一级缓存是开启的,二级缓存是关闭的

        结论: 一级缓存作用于每次SqlSession,因为每次与数据库的交互都会创建一个SqlSession,也就是说Mybatis的一级缓存只存在于每次会话中(感觉比较鸡肋的一个东西).

        通过之前的文章,已经了解到mybatis提供给了我们顶级API对象 SqlSession来操作数据库,但是其实内部真正负责执行的是Executor.

     

     a . 之前说过,当我们未选择执行器类型,生成默认的SqlSession(DefaultSqlSession)时候,会采用SimpleExecutor. 那我们现在来看一下SimpleExecutor

     a . 首先看到SimpleExecutor继承了BaseExecutor , 接下来我们点进去看BaseExecutor.

     b . doSelect 和 doUpdate()方法,里面都创建了Statement对象, 确实也说明每次查询或者更新都会创建新的Statement. 这里与与MapperStatement不同,MapperStatement是每一个sql语句的标签会生成一个MapperStatement对象.

     a . localCache 的成员变量,我们已经可以大致猜出来它就是一级缓存(本地缓存)

     b . 点进去发现,其实就是一个final类型的Map. key 和  value 都为object. 所以equals()和hashCode()方法都被重写了.

     a .通过查看put方法,知道key存放的是CacheKey对象. CacheKey的对象创建.大概会用到sql语句, sql语句的id. limit , paramter(用户的传参) ,offset

    a . 截止到此,就已经看到了mybatis的真面目. 当开启的时候,如果命中了,就取出来,但是如果取出为空,也会再次查询数据库.并再次将结果放入到Map内

    b . 因为缓存范围太小, 多个sqlSession同时进行,如果一个SqlSession删除或者新增,可能会造成脏数据.

     2.  二级缓存

          

     结论:二级缓存作用于namespace中(可以作用于多个SqlSessionle了),我们一般都是一张表都存在一个配置Mapper.xml, 因为多表联查的时候,可能会导致某个缓存未清,造成脏数据.使用条件也比较苛刻.

      1. 在MyBatis的配置文件中开启二级缓存。<setting name="cacheEnabled" value="true"/>

      2. 在MyBatis的映射XML中配置cache或者 cache-ref 。

        cache标签用于声明这个namespace使用二级缓存,并且可以自定义配置。<cache/>

    a . 其实在创建SqlSession的时候,我们就已经知道二级缓存是用CachingExecutor来处理的(装饰者模式)

    b . 用户执行查询,如果二级缓存打开,默认会先进入CachingExecutor,如果未命中才会继续委派SimpleExecutor来执行查询(截止到这,就与不打开二级缓存一样了.)

     

     

    a . 根据代码,大概知道TransactionCacheManage大概与缓存有关了.

    a . 这里其实缓存其实也是一个Map . 依然是CacheKey. 但是这里还有commit()方法.

    如果二级缓存想要命中实现,commit之后才能生效,不然将不会命中,原因:
    如果不调用commit方法的话,由于TranscationalCache的作用,并不会对二级缓存造成直接的影响 . 原因是因为mybatis的缓存会被一个transactioncache类包装住,所有的cache.putObject全部都会被暂时存到一个map里,等事务提交以后,这个map里的缓存对象才会被真正的cache类执行putObject操作。

    这么设计的原因是为了防止事务执行过程中出异常导致回滚,如果get到object后直接put进缓存,万一发生回滚,就很容易导致mybatis缓存被脏读


    作者:wuxinliulei
    链接:https://www.zhihu.com/question/40718470/answer/87915129
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    b . 在二级缓存执行流程后就会进入一级缓存的执行流程,因此不再赘述

    c . 总体上说 不需要使用Mybatis的缓存,都很鸡肋

                

            

    人总得做点什么 ,不是么
  • 相关阅读:
    c++ CPO ADL
    c++ intrusive
    c++边界检查
    C++仿函数
    C++ RefBase
    c++ vector容器的尺寸问题
    关于调用约定
    C++学习之字符串类、容器
    C++异常
    Git常用命令大全,迅速提升你的Git水平
  • 原文地址:https://www.cnblogs.com/liweibing/p/12750834.html
Copyright © 2011-2022 走看看