mybatis 源码解读及缓存机制

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

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。

    173 引用 • 414 回帖 • 367 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 316 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 108 关注
  • Firefox

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

    7 引用 • 30 回帖 • 389 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 250 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 722 关注
  • Anytype
    3 引用 • 31 回帖 • 15 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 31 关注
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 818 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 826 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 79 关注
  • OpenCV
    15 引用 • 36 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    170 引用 • 1529 回帖 • 1 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 166 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    139 引用 • 926 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖 • 1 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 82 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注