mybatis 源码解读及缓存机制

本贴最后更新于 1852 天前,其中的信息可能已经事过境迁

1.MyBatis 的 SqlSession 的四大对象:

   Executor、StatemenHandler、ParameterHandler、ResultHandler

2.SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession 简介

官方对SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession的作用域范围分别是:方法范围、应用范围、请求或方法范围。
其中,SqlSessionFactoryBuilder这个类可以被实例化,使用和丢弃,一点那创
建了SqlSessionFactory,就不需要它了。因此 SqlSessionFactoryBuilder 实例的
最佳范围是方法范围(也就是局部方法变量)。
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理
由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间
不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad 
smell)”。因此  SqlSessionFactory 的最佳范围是应用范围。有很多方法可以
做到,最简单的就是使用单例模式或者静态单例模式。

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全
的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围。

3.sqlsession 创建

参见5中mybatis的初始化
  1. mybatis 的一级缓存
SqlSession级别的缓存,操作数据库时需要构造SQLSession对象, 在对象中有一个数据结构(HashMap)用于存储缓存数据,不同的SQLSession对象之间的
缓存数据是不共享的,即独立的.
spring 中 结合 mybatis中,默认情况下,数据库处于自动提交模式,每一条sql
语句处于一个单独的事务中,语句执行完毕时,如果执行成功则隐式提交事
务。而mybatis的一级缓存在这种情况下是无效的,想要一级缓存起作用,则要
开启事务:

image.png

开启事务后
image.png

5.原理分析

mybatis的初始化:
    1.首先会创建SqlSessionFactoryBuilder建造者对象,然后由它进行创建 
       SqlSessionFactory
    2.然后会解析xml配置文件,实际为configuration节点的解析操作,还要解析 
      transactionManager及datasource,最后将解析后的结果存到configuration
      对象中。
    3.解析完MyBatis配置文件后,configuration就初始化完成了,然后根据 
      configuration对象来创建SqlSession,到这里时,MyBatis的初始化的征程已 
      经走完了。
mybatis 的SQL查询流程:
    1.调用selectOne方法进行SQL查询,selectOne方法最后调用的是selectList, 
      在selectList中,会查询configuration中存储的MappedStatement对象, 
      mapper文件中一个sql语句的配置对应一个MappedStatement对象,然后调 
      用执行器进行查询操作。
    2.执行器在query操作中,优先会查询缓存是否命中,命中则直接返回,否则 
      从数据库中查询。
    3. 真正的doQuery操作是由SimplyExecutor代理来完成的,该方法中有2个子 
       流程,一个是SQL参数的设置,另一个是SQL查询操作和结果集的封装。
    3.1 首先获取数据库connection连接,然后准备statement,然后就设置SQL 
         查询中的参数值。打开一个connection连接,在使用完后不会close,而是 
         存储下来,当下次需要打开连接时就直接返回。

final.参考

1、MyBatis一级缓存的生命周期和SqlSession一致。
2、MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓
存的功能性上有所欠缺。
3、MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布
式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。
4、MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的
共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同
的组合,对Cache的可控性也更强。
5、MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使
用二级缓存的条件比较苛刻。
6、在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式
环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口
实现,有一定的开发成本,直接使用Redis、Memcached等分布式缓存可能成本
更低,安全性也更高。
7. 个人建议MyBatis缓存特性在生产环境中进行关闭,单纯作为一个ORM框架使
用可能更为合适。
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 430 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 373 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 46 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖 • 1 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 690 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 346 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 439 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 26 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 1 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    1 引用 • 11 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 2 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 452 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 562 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 23 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 4 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖