• 【串线篇】Mybatis缓存原理


    MyBatis缓存机制:Map;能保存查询出的一些数据;

    一级缓存:线程级别的缓存;本地缓存;SqlSession级别的缓存;

    二级缓存:全局范围的缓存;除过当前线程;SqlSession能用外其他也可以使用

    一级缓存

    一级缓存:MyBatis:SqlSesion级别的缓存;默认存在,不需要设置。

    机制:只要之前查询过的数据,mybatis就会保存在一个缓存中(Map);下次获取直接从缓存中拿;当前session有效

    一级缓存原理观察

    一级缓存失效情况

    一级缓存失效的几种情况:

    - 1、不同的SqlSession对应不同的一级缓存

    - 2、同一个SqlSession但是查询条件不同

    - 3、同一个SqlSession两次查询期间执行了任何一次增删改操作(mybatis自动清缓存)

    方式内容被更新后还保存着老数据

    - 4、同一个SqlSession两次查询期间手动清空了缓存openSession.clearCache();

    二级缓存

    1.应用

    二级缓存:namespace级别的缓存;SqlSession关闭或者提交以后有效

    一级缓存;SqlSession关闭或者提交以后,一级缓存的数据会放在二级缓存中;

    二级缓存的使用:mybatis默认没有使用的;配置步骤;

    1)、全局配置开启二级缓存

    mybatis-config.xml

    <!-- 开启全局缓存开关; -->

            <setting name="cacheEnabled" value="true"/>

    2)、配置某个dao.xml文件,让其使用二级缓存即可

    <cache></cache>

    3)、

    缓存实现要求指定POJO即JavaBean要求实现Serializable接口

    2.二级缓存命中率

    DEBUG 09-28 14:22:40,245 Cache Hit Ratio [com.atguigu.dao.TeacherDao]: 0.0

    DEBUG 09-28 14:22:40,245 Cache Hit Ratio [com.atguigu.dao.TeacherDao]: 0.5

    DEBUG 09-28 14:22:40,245 Cache Hit Ratio [com.atguigu.dao.TeacherDao]: 0.66:

    0.0=0/1   

    0.5=1/2    第二次查到

    0.66=2/3   第三次查到

    0.5=2/4    第四次没查到

    分母代表第几次尝试去二级缓存中取数据

    分子代表取中了几次

    Mybatis缓存之缓存查询顺序

    1. 不会出现一级缓存和二级缓存中有同一个数据。因为二级缓存是在一级缓存关闭之后才有的

    2.任何时候都是先看二级缓存、再看一级缓存,如果大家都没有就去查询数据库,数据库的查询后的结果放在一级缓存中了;

         【口诀】二 == 一 == 库

    Mybatis之缓存原理

    所谓二级缓存是名称空间级别的缓存,什么意思呢?

    TeacherDao.xml首行

    <mapper namespace="com.atguigu.dao.TeacherDao">就是这个意思

    缓存原理:

    Mybatis缓存之整合第三方缓存

    为什么要用第三方缓存?因为mybatis的缓存机制说白了就是一个map,不够强大。但幸好mybatis有自知之明将其Cache做成了一个接口开放出来,我们可以实现这个接口用第三方专业的缓存框架去自定义

    MyBatis;---Cache;

    整合ehcache;ehcache非常专业的java进程内的缓存框架;

    1、导包

    ehcache-core-2.6.8.jar(ehcache核心包)

    mybatis-ehcache-1.0.3.jar(ehcache的整合包,导了这个包我们连自己实现Cache都不用自己写了这个包的思想跟我们是一样的EhcacheCache implements org.apache.ibatis.cache.Cache) 

    slf4j-api-1.7.21.jar

    slf4j-log4j12-1.7.21.jar

    2、ehcache要工作有一个配置文件;

         文件名叫ehcache.xml;放在类路径的根目录下(官方的复制过来)

    3、在Dao.xml或者说是mapper.xml一个意思中配置使用自定义的缓存

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

    4、若别的dao还要用这个同一块缓存;缓存引用cache-ref

    比如跟别的Dao(TeacherDao)公用一块缓存

    <!--  和别的dao共用一块缓存-->

        <cache-ref namespace="com.atguigu.dao.TeacherDao"/>

     

     

     

     

  • 相关阅读:
    无限级分类表设计
    多表连接
    连接(上接子查询那一篇随笔)
    数据库中常用指令
    子查询
    mysql查询表达式解析
    mysql单表删除记录DELETE
    mysql 单表更新记录UPDATE
    七言
    时分秒计算案例
  • 原文地址:https://www.cnblogs.com/yanl55555/p/11936736.html
Copyright © 2020-2023  润新知