墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. Mybatis
  4. 正文

Mybatis源码解析篇(执行器)

2023年 5月 8日 163点热度 1人点赞 0条评论

执行器

以下是 MyBatis 中的三种执行器的详细说明、优缺点和适合场景以及配置代码:

  1. SimpleExecutor

SimpleExecutor 是 MyBatis 默认的执行器,它是一种非常简单的执行器。对于每次执行的 SQL 语句,SimpleExecutor 都会创建一个新的 Statement 对象,用完即关闭。SimpleExecutor 的优点在于它非常简单,可以很快地执行 SQL 语句,适合处理简单的 SQL 语句。

优点:

  • 简单,易于实现。
  • 每次执行都会创建一个新的 Statement 对象,避免了 Statement 对象的共享问题。

缺点:

  • 每次执行都会创建一个新的 Statement 对象,增加了系统开销。
  • 不支持 Statement 对象的缓存,无法复用已经创建的 Statement 对象,影响性能。

适合场景:

  • 处理简单的 SQL 语句。
  • SQL 语句较少,不需要缓存 Statement 对象。

配置代码:

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="root" />
      </dataSource>
      <mapperScan basePackage="com.example.mapper" />
      <configuration>
        <defaultExecutorType type="SIMPLE" />
      </configuration>
    </environment>
  </environments>
</configuration>
  1. ReuseExecutor

ReuseExecutor 是一种可重用的执行器,它会检查是否有可复用的 Statement 对象,如果有则重用,否则创建一个新的 Statement 对象。相较于 SimpleExecutor,ReuseExecutor 可以避免频繁创建和销毁 Statement 对象,提高了性能。

优点:

  • 可复用 Statement 对象,避免了频繁创建和销毁 Statement 对象,提高了性能。
  • 对于重复的 SQL 语句可以重用 Statement 对象,提高了性能。

缺点:

  • 无法缓存 PreparedStatement 对象,对于动态 SQL 语句性能不如 BatchExecutor。

适合场景:

  • 处理比较复杂的 SQL 语句,需要复用 Statement 对象。
  • SQL 语句较少,不需要缓存 PreparedStatement 对象。

配置代码:

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="root" />
      </dataSource>
      <mapperScan basePackage="com.example.mapper" />
      <configuration>
        <defaultExecutorType type="REUSE" />
      </configuration>
    </environment>
  </environments>
</configuration>
  1. BatchExecutor

BatchExecutor 是一种批处理执行器,可以将多个 SQL 语句放在同一批处理中执行,减少了通信次数,提高了性能。BatchExecutor 还支持 PreparedStatement 对象的缓存,对于动态 SQL 语句性能也比较好。

优点:

  • 可以将多个 SQL 语句放在同一批处理中执行,减少了通信次数,提高了性能。
  • 支持 PreparedStatement 对象的缓存,对于动态 SQL 语句性能较好。

缺点:

  • 处理 SQL 语句较为复杂,需要组织批处理语句。

适合场景:

  • 处理大量的 SQL 语句,需要批量执行。
  • 处理动态 SQL 语句,需要缓存 PreparedStatement 对象。

配置代码:

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="root" />
      </dataSource>
      <mapperScan basePackage="com.example.mapper" />
      <configuration>
        <defaultExecutorType type="BATCH" />
      </configuration>
    </environment>
  </environments>
</configuration>

其实还有一种执行器,它的主要功能是缓存,为了mybatis实现了缓存相关的功能,默认无需配置只需要开启缓存,就可以启用。

缓存相关的执行器和类

  1. CachingExecutor

CachingExecutor 是 MyBatis 中的缓存执行器,它可以在执行 SQL 语句时缓存查询结果,避免每次查询都要重新执行 SQL 语句,提高了查询性能。CachingExecutor 内部使用了装饰器模式,可以将查询结果缓存到内存中,也可以将查询结果缓存到二级缓存中。

优点:

  • 可以缓存查询结果,避免每次查询都要重新执行 SQL 语句,提高了查询性能。
  • 可以将查询结果缓存到内存中或者二级缓存中,提高了查询效率。

缺点:

  • 缓存查询结果会消耗内存,需要根据实际情况进行配置。
  • 如果查询结果经常变化,缓存查询结果会导致数据不一致。

适合场景:

  • 查询结果较为稳定,不会经常变化。
  • 查询结果查询频率很高。

配置代码:

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="root" />
      </dataSource>
      <mapperScan basePackage="com.example.mapper" />
      <configuration>
        <defaultExecutorType type="CACHING" />
      </configuration>
    </environment>
  </environments>
</configuration>
  1. PerpetualCache

PerpetualCache 是 MyBatis 中的永久缓存,它将查询结果缓存到内存中,永久保存。PerpetualCache 的缓存策略非常简单,只要缓存中有对应的查询结果,就直接返回缓存结果。PerpetualCache 适用于查询结果较为稳定,不会经常变化的情况。

优点:

  • 简单,易于实现。
  • 缓存查询结果到内存中,查询效率高。

缺点:

  • 缓存查询结果会消耗内存,需要根据实际情况进行配置。
  • 如果查询结果经常变化,缓存查询结果会导致数据不一致。

适合场景:

  • 查询结果较为稳定,不会经常变化。
  • 查询结果查询频率很高。

配置代码:

<cache type="PERPETUAL">
  <property name="size" value="1024" />
  <property name="flushInterval" value="60000" />
</cache>
  1. LruCache

LruCache 是 MyBatis 中的 LRU 缓存,它可以缓存查询结果,并定期清理最近最少使用的查询结果,避免缓存占用过多内存。LruCache 使用 LinkedHashMap 实现,可以按照查询结果的访问顺序进行排序,将最近最少使用的查询结果清除。LruCache 适用于查询结果较多,缓存占用内存较大的情况。

优点:

  • 缓存查询结果到内存中,查询效率高。
  • 可以定期清理最近最少使用的查询结果,避免缓存占用过多内存。

缺点:

  • 缓存查询结果会消耗内存,需要根据实际情况进行配置。
  • 如果查询结果经常变化,缓存查询结果会导致数据不一致。

适合场景:

  • 查询结果较多,缓存占用内存较大。
  • 查询结果查询频率较高,但查询结果经常变化。

配置代码:

<cache type="LRU">
  <property name="size" value="1024" />
  <property name="flushInterval" value="60000" />
</cache>
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java mybatis 执行器 源码
最后更新:2023年 5月 8日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了!
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
设计模式:桥接模式 美团外卖搭上 DeepSeek 这趟 AI 快车,外卖界要变天啦! 优化Shadowsocks-libev服务器以获得更好的表现 双指针法和归并排序法 - 优化有序数组合并的算法 告别工具切换噩梦!阿里巴巴通义万相 Wan2.1-VACE:一个模型,通吃视频生成与编辑! DuckDuckGo新推出隐私保护电子邮件服务,让用户告别跟踪监控!
标签聚合
动态规划 deepseek 设计模式 AI 教程 java spring 算法

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策