zoukankan      html  css  js  c++  java
  • mybatis的一级缓存和二级缓存(1)

    1.mybatis一级缓存,sqlSesion级别的缓存,一级缓存默认一直开启的,sqlSession级别的一个Map,把查询的数据放到一个Map中,以后需要相同的数据,直接从Map中去取

         与数据库一次会话期间,查询到的数据会放到本地缓存中

         以后需要相同的数据,直接从缓存中拿,不再去从数据中查询

    2.mybatis一级缓存失效情况

      (1)sqlSession不同

    (2)sqlSession相同,查询条件不同,(如查询了id为1的员工,再去查id为2的员工,一级缓存失效,当前一级缓存还没有数据)

    (3)sqlSession相同,两次查询之间执行了增删改查操作(这个增删改查可能对当前数据有影响)

    (4)sqlSession相同,手动清除一级缓存,如使用openSession.clearCache()

    3.mybatis二级缓存

    场景:一个会话,查询一条数据,这个数据会被放到一级缓存中

            如果会话关闭,一级缓存的数据会被保存到二级缓存中

              不同的namespace查询的数据会放到自己对应的缓存中(map)

        实现效果:数据从二级缓存获取

                        查询到的数据会默认放到一级缓存中

                        只有会话提交或者关闭,一级缓存中的数据才会被转到二级缓存中

    使用二级缓存

    (1)在mybatis-config.xml中配置

    <!-- 全局启用mybatis二级缓存 -->
    <setting name="cacheEnabled" value="true"/>

    (2)在mapper.xml中添加<cache>标签

    <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache>

    eviction:缓存回收策略
    LRU-最近最少使用的,移除最长时间不被使用的对象
    FIFO-先进先出,按对象进入缓存的顺序来移除他们
    SOFT-弱引用,移除基于垃圾回收器状态和软引用规则的对象
    WEAK-弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
    默认的是LRU
    flushInterval:缓存刷新间隔
    缓存多长时间清空一次, 默认不清空,设置一个毫秒值
    readOnly:是否只读
    true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据
    mybatis为了加快获取速度,直接将数据在缓存的引用交给用户,不安全,速度快
    false:非只读,mybatis觉得获取的数据可能会被修改
    mybatis会利用序列化&反序列化的技术克隆一份新的数据给用户,安全,速度慢
    默认为false
    size:缓存最放多少元素
    type:指定自定义缓存全类名


    (3)POJO实现序列化接口 implements Serializable


     
  • 相关阅读:
    谜之This
    JS 面向对象 ~ 继承的7种方式
    JS 面向对象 ~ 创建对象的 9 种方式
    JS 原型与原型链
    ES6 Promise 详解
    Vue diff 算法
    Vue Router 路由实现原理
    Vue Keep-alive 原理
    Vue 响应式原理
    JS 有趣的JS
  • 原文地址:https://www.cnblogs.com/shuaifing/p/9234016.html
Copyright © 2011-2022 走看看