waynblog

orm 框架使用性能比较

本文将给大家做一个 Java 开发中常用的 orm 框架 mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm 等的性能表现。

环境:

idea 
jdk17
spring boot 3.0.7
mysql 8.0

测试条件常规对象

orm 框架是否支持 xml是否支持 Lambda对比版本编码方式
mybatis☑️☑️3.5.4lambda +xml 优化
sqltoy☑️☑️5.2.98lambda
lazy✖️☑️1.2.4-JDK17-SNAPSHOTlambda
mybatis-flex☑️☑️1.8.0lambda +xml 优化
easy-query✖️☑️1.10.31lambda
mybatis-mp☑️☑️1.4.1xml 优化
jpa☑️☑️3.0.7----------------------
dbvisitor☑️☑️5.4.1xml 优化
beetlsql支持 md☑️3.26.0-RELEASEinsert ignore into 优化
dream_orm✖️☑️1.3.0insert ignore into (当前版本不支持)

数据库表 (含有唯一性索引 s_u)

CREATE TABLE `sys_user`
(
`column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null',
`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',
`scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null',
`status` tinyint(1) DEFAULT NULL COMMENT '状态',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `s_u` (`scope`,`username`)
) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页)

项目设计

  • 声明 ORMRepository 接口提供对应增删改查方法 

  • Image

  • 声明 ORMComparisonRepository 接口 继承 ORMRepository 下游由不同 ORM 实现

  • 声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同 orm 实现方法执行方法测试产生测试结果

  • 声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储 

    Image

  • 不同 ORM 框架 mybatis-plus、sqltoy、Lazy、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm 创建 ORMComparisonRepository 的实现

  • Image

  • 不同 ORM 操作数据的实现

测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000

项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare

测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000

项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare

测试执行过程

清空需要插入表中所有数据
通过ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档

查看结果曲线图

Image

测试结果(结果只提供参考)

MYBATIS_FLEX(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:3 毫秒9 毫秒84 毫秒827 毫秒7199 毫秒
LAZY(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:3 毫秒4 毫秒51 毫秒367 毫秒3429 毫秒
MYBATIS_MP(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:2 毫秒9 毫秒77 毫秒677 毫秒7177 毫秒
DB_VISITOR(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:9 毫秒24 毫秒166 毫秒1609 毫秒16990 毫秒
MYBATIS_PLUS(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:9 毫秒9 毫秒131 毫秒714 毫秒7349 毫秒
JPA(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:13 毫秒30 毫秒1247 毫秒9894 毫秒99568 毫秒
EASY_QUERY(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:10 毫秒21 毫秒202 毫秒1574 毫秒15692 毫秒
SQLTOY(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:5 毫秒17 毫秒189 毫秒1537 毫秒15918 毫秒
DREAM_ORM(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:12 毫秒19 毫秒159 毫秒1543 毫秒15437 毫秒
BEETL_SQL(batchStory)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:17 毫秒30 毫秒174 毫秒1719 毫秒16831 毫秒
MYBATIS_FLEX(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:5 毫秒4 毫秒19 毫秒153 毫秒1388 毫秒
LAZY(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:6 毫秒3 毫秒11 毫秒93 毫秒700 毫秒
MYBATIS_MP(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:9 毫秒3 毫秒12 毫秒111 毫秒988 毫秒
DB_VISITOR(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:4 毫秒1 毫秒8 毫秒70 毫秒782 毫秒
MYBATIS_PLUS(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:9 毫秒3 毫秒25 毫秒152 毫秒1309 毫秒
JPA(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:15 毫秒3 毫秒25 毫秒108 毫秒1082 毫秒
EASY_QUERY(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:7 毫秒1 毫秒9 毫秒61 毫秒637 毫秒
SQLTOY(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:14 毫秒5 毫秒16 毫秒80 毫秒602 毫秒
DREAM_ORM(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:7 毫秒1 毫秒13 毫秒62 毫秒719 毫秒
BEETL_SQL(findPage)影响行数:10影响行数:100影响行数:1000影响行数:10000影响行数:100000
执行时间:18 毫秒2 毫秒14 毫秒89 毫秒861 毫秒

写在最后

经过将近一周时间的框架收集、学习、实验、编码、测试市面上常见的 ORM 框架,过程中拜读了很多作者的博文、样例,学习很多收获很多。重新梳理下整理的框架:mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_rom

下面从一下几点出发作出总结

  • 文档方面:学习过程中 mybatis-plus、jpa 提供的文档资料是比较全和完善,经得住市场的考验

  • 技术方面:beetlsql、easy-query、mybatis 系列 三类框架都已经支持 spring 和 solon 生态 其技术架构设计可以推荐大家学习

  • 并发方面:jpa、db_visitor 还需要开发时候深度优化处理

  • 大数据存储方面:Lazy 具有一定优势

  • 大数据查询方面:sqltoy、dream_orm、Easy_query、lazy、db_visitor 反射处理的比较优秀

以上是个人整理的观点,如果大家有不同的想法和意见可以在 gitee 或者个人博客留言 CSDN

细节数据对比(一万以内基本相差不大)

  • 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次 batchStory,一百次 findPage 每次执行的条数在之前数据的基础上 + 1

从形成的折线图看(具体趋势看排名与测试结果)

  • 存储性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、dream_rom、sqltoy、beetlSql 更适合并发性数据存储。jpa、db_visitor 处理耗时较长

  • 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、 dream_rom、easy-query、sqltoy、db_visitor、beetlSql 都比较稳定。jpa 处理时间明显起伏

Image

批量保存:

  • 一万条数据以内 lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、sqltoy、beetlSql、jpa、db_visitor 性能趋于一致

  • 十万数据时,处理时间由快到慢依次是:

    • 一万毫秒以内:lazy、mybatis-flex、mybatis-mp、mybatis-plus、

    • 一万毫秒以上: easy-query、dream_rom、sqltoy、beetlSql、db_visitor、jpa,其中 db_visitor、jpa 处理时间明显起伏

分页查询:

  • 一万条数据以内 几款 ORM 均保持在 200 毫秒内

  • 十万数据时,处理时间由快到慢依次是:

    • 一千毫秒以内:sqltoy、dream_rom、db_visitor、easy-query、lazy、beetlSql、mybatis-plus

    • 一千毫秒以上:mybatis-mp、jpa、mybatis-flex

快速数据对比 (大数据曲线图)

Image

Image

如果觉得这篇文章写的不错的话,不妨点赞加关注,我会更新更多技术干货、项目教学、经验分享的文章。


既然都阅读到这里啦,不妨点个关注吧,您的关注就是我最大的更新动力😘。

Image