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


     
  • 相关阅读:
    基于微信小程序的票价和时间选择以及计算总价
    基于Echarts的股票K线图展示
    基于Echarts的中国地图数据展示
    微信公众号网页授权登录获取用户基本信息
    springboot+mybatis+maven角色权限框架
    java服务端微信小程序支付
    推理 —— 猜帽子颜色
    Java 容器的使用及数组、List、Set 的相互转换
    构建工具 —— Groovy 与 Gradle
    效率生产力工具 —— idea 插件
  • 原文地址:https://www.cnblogs.com/shuaifing/p/9234016.html
Copyright © 2011-2022 走看看