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

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.kler.cn/a/516740.html

相关文章:

  • Blazor-Blazor呈现概念
  • Qt Enter和HoverEnter事件
  • 数据结构:二叉树—面试题(一)
  • 详细介绍:Kubernetes(K8s)的技术架构(核心概念、调度和资源管理、安全性、持续集成与持续部署、网络和服务发现)
  • 使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试
  • 线性表-线性存储结构
  • 3、搭建企业知识库:从需求分析到方案设计
  • 配电网的自动化和智能化水平介绍
  • Python中使用Ollama API
  • SpringBoot的Swagger配置
  • Javaweb之css
  • 时序数据库的使用场景
  • openresty(nginx)+lua+kafka实现日志搜集系统
  • 【Redis】事务
  • Windows Docker Desktop安装及使用 Docker 运行 MySQL
  • elasticsearch segment数量对读写性能的影响
  • STM32_SD卡的SDIO通信_基础读写
  • 互联网产品品牌形象构建与开源AI智能名片S2B2C商城小程序的应用研究
  • Lock和Synchronized的区别,源码分析
  • 基于Springboot用axiospost请求接收字符串参数为null的解决方案
  • 【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)
  • 68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)
  • JAVASE入门八脚-Spring ,时间Data,Dateformat,parse,Math,容器
  • Linux网络 | 网络计算器客户端实现与Json的安装以及使用
  • 深度剖析 PyTorch框架:从基础概念到高级应用的深度学习之旅!
  • OpenCV: 深入理解OpenCV中CV_WRAP_AS宏及其作用