当前位置: 首页 > news >正文

MyBatis最佳实践:MyBatis 框架的缓存

  1. 缓存的概念:

    1. 在内存中临时存储数据,速度快,可以减少数据库的访问次数
    2. 经常需要查询,不经常修改的数据,不是特别重要的数据都适合存储到缓存中
  2. 缓存的级别:

    1. 一级缓存(默认开启):SqlSession 级别
      1. 一级缓存存储的是对象
    2. 二级缓存(默认关闭):nameSpace 级别
      1. 二级缓存存储的是实际数据
  3. 优先访问级:

    1. 先访问二级缓存,再访问一级缓存,其次是数据库
  4. MyBatis 的一级缓存(本地缓存):

    1. 一级缓存存放在 SqlSession 对象中
    2. SqlSession 对象来访问数据库
    3. 在 SqlSessin 对象中有:
      1. cache:缓存(底层是 HashMap)
      2. Executor:执行器
    4. 作用:
      1. 与数据库同一次会话期间查询到的数据会放入到本地缓存中去
      2. 如果以后获取相同的数据直接去缓存中拿取,没必要再去查询数据库
    5. 示例:
      1. 执行两次方法只进行了一次查询,且为一个对象
  5. 一级缓存失效:

    1. 原因:
      1. SqlSession不同:
      2. SqlSession相同,查询条件不同:
      3. SqlSession相同,两次查询之间进行了增删改查操作:
      4. 手动清除一级缓存:
        1. session.clearCache():
  6. 二级缓存:

    1. 设置配置:
    2. 在 xml 中开启二级缓存:
    3. 使用二级缓存:实现序列化接口
      1. 目的:把类转换成数据
    4. 关闭一级缓存:
      //查询信息
      List<User> users1 = mapper.findById(6);
      session.close();    //关闭一级缓存
      List<User> users2 = mapper2.findById(6);
      session.close();    //关闭一级缓存
  7. Catch 参数的细节:

    1. eviction(回收策略):
      1. LRU(最近最少使用):移除最长时间不被使用的对象,默认值
      2. FIFO(先进先出):按对进入缓存的顺序来移除
      3. SOFT(软引用):移除基于垃圾收集处理器状态和弱引用规则的对象
      4. WEAK(弱引用):更积极地移除基于垃圾收集器状态和弱引用规则的对象
    2. flushinterval(刷新间隔):
      1. 可以被设置为任意的正整数,而且他们代表一个合理的毫秒形式的时间段
      2. 默认情况不设置,即没有刷新间隔,缓存仅仅在调用语句时刷新
    3. size(引用数目):
      1. 可以被设置为任意正整数,要记住缓存的对象数目和运行环境可用内存支援数目。默认值时 1024
    4. readOnly(只读):
      1. true(只读缓存):会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改,这提供了很重要的性能优势
      2. false(读写缓存):通过序列化返回缓存对象的拷贝,这种方式会慢一些,但是安全,因此默认是  false
    5. 配置结果:
      <cache eviction="FIFO"
      flushInterval="6000"
      size="512"
      readOnly="true"/>
  8. MyBatis 缓存查询顺序:

    1. 先查询二级缓存,因为二级缓存中可能有其他程序查询出来的数据,可以直接拿来用
    2. 如果二级缓存没有命中,再查询一级缓存
    3. 如果一级缓存也没有命中,则查询数据库
    4. SqlSession 关闭之后,一级缓存的数据会写入二级缓存
http://www.lryc.cn/news/526198.html

相关文章:

  • 基于LangGraph、Groq和Tavily打造可以调用外部搜索引擎工具的对话机器人(核心代码 万字详解)
  • 衡量算法性能的量级标准:算法复杂度
  • PHP校园助手系统小程序
  • 如何在Spring Boot项目中高效集成Spring Security
  • 【PostgreSQL内核学习 —— (WindowAgg(一))】
  • PAT甲级-1020 Tree Traversals
  • LVGL+FreeRTOS实战项目:智能健康助手(Max30102篇)
  • 人脸识别【python-基于OpenCV】
  • redis常用命令和内部编码
  • UI操作总结
  • 数据结构——实验八·学生管理系统
  • 力扣hot100-->滑动窗口、贪心
  • Linux 内核中的高效并发处理:深入理解 hlist_add_head_rcu 与 NAPI 接口
  • centos哪个版本建站好?centos最稳定好用的版本
  • 软件越跑越慢的原因分析
  • LeetCode 力扣热题100 二叉树的直径
  • 【图文详解】lnmp架构搭建Discuz论坛
  • 小哆啦解题记:整数转罗马数字
  • 【Java数据结构】排序
  • 我的求职之路合集
  • 数据结构(四) B树/跳表
  • Arcgis国产化替代:Bigemap Pro正式发布
  • LBS 开发微课堂|AI向导接口服务:重塑用户的出行体验
  • AI导航工具我开源了利用node爬取了几百条数据
  • openstack单机安装
  • Vue3实现小红书瀑布流布局任意组件动态更新页面方法实践
  • 深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)
  • Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
  • python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
  • 【论文+源码】Diffusion-LM 改进了可控文本生成