• MyBatis 缓存详解


    https://www.cnblogs.com/wuzhenzhao/p/11103043.html

    一级缓存

    • Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。如果同一个SqlSession中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中已经存在改键值时,则会返回缓存中的对象。(一个SqlSession连续两次查询 得到的是同一个java对象)
    • 任何的insert update delete操作都会清空一级缓存(增删改任何记录都会清空当前SqlSession的缓存)。
    • Spring整合Mybatis的时候一级缓存的问题:(默认一级缓存是开启的

        在未开启事物的情况之下(@Transactional),每次查询,spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有启作用的

        在开启事物的情况之下(@Transactional),spring使用threadLocal获取当前资源绑定同一个sqlSession,因此此时一级缓存是有效的

    • 总结: 一级缓存就是mapper.aaa(c,d)。 同一mapper 同一方法 同一参数。 SqlSession连续两次查询 得到的是同一个java对象(通过反序列化得到)。
    • 如何实现呢。
    • 利用 ThreadLocal  (当前线程变量副本)和 map 实现。 ThreadLocal<Map<Object, Object>>  把 请求方法+参数 通过指定算法生成key 放到map 中,并把map 放到ThreadLocal 中,当同 同一mapper 同一方法 同一参数 查询时,会去map中的数据。 然后把数据反序列化出来,就不用和数据库交付了。
    • https://blog.csdn.net/u013887008/article/details/80379938
    • 二级缓存

    • 每个sqlSession都有自己的一级缓存,多个sqlSession共享二级缓存
    • Mybatis二级缓存可以理解为存在SqlSessionFactory的生命周期
  • 相关阅读:
    拒绝喝酒理由1
    动态调用事件,事件的方法
    c#发送图片
    c#截屏功能的实现
    devexpress中文讨论论坛
    解析javascript变量
    devexpress_PivotGrid说明
    python学习之老男孩python全栈第九期_day022知识点总结——初识面向对象
    python学习之老男孩python全栈第九期_day022作业
    员工信息表
  • 原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/14507568.html
Copyright © 2020-2023  润新知