【Springboot】JPA与MyBatis的性能对比

发布于:2024-10-24 编辑:匿名 来源:网络

前言这几天听朋友说JPA非常好用,根本不需要写sql。我在想,如果一个程序员不写SQL,那他还能叫程序员吗?而且越高级的工具封装的工具越多,可扩展性和效率都很低。

另外,我不喜欢过于封闭的东西。平时喜欢手写SQL,所以写业务总是使用mybatis。

然后我发现jpa的saveAll()批量插入和批量更新速度太慢,这使得一些用excel导入的东西非常慢,使得本来可以通过同步解决的东西每次导入都得启动异步。我个人觉得这种做法很不好。

因为异步实际上是指在不影响当前业务的情况下在其他时间段做事,比如运行计划任务、异步更新增量信息等。代码中有很多异步的东西包含异步的东西,也就是说excel导入是异步的,jpa慢,异步包括异步。

整个链路很长,排查问题可能需要很长时间。安装jpa和mybatis代码语言: javascript copy org.mybatis.spring.bootmybatis-spring-boot-starter mysqlmysql-connector-javaorg.springframework.bootspring-boot-starter-data-jpa这些东西,只要引入一个springboot xml作为父类来创建类代码语言即可: javascript copy @Datapublic class TestMybatis { private Long id; } /** * 域帐号 */ private String userId; /** * 主要指标*/ private String mainMetric; /** * 子指标*/ private String subMetric; /** * 指标项*/ private String metricItem;}@SuppressWarnings("serial")@javax.persistence.Entity@javax. persistence.Table(name = "test")@lombok.Datapublic class TestJpa { @javax.persistence.Id@GenerateValue(strategy = GenerationType.IDENTITY) 私有长 id; /** * 域帐号*/ private String userId; /** * 主要指标*/ private String mainMetric; /** * 子指标*/ private String subMetric; / ** * 指标项*/ private String metricItem;}/** * @author Kakki * @version 1.0 * @create 06-17 17:39 * 这用于 Jpa 和 Mapper。

*/@Repositorypublic interface TestRee extends JpaRepository< TestRe, String> {} 代码语言:javascript copy 这是mybatis的xml insert into test(user_id,main_metric, sub_metric, metric_item)values?? (#{item.userId}, #{item.mainMetric}, #{item.subMetric}, #{item.metricItem}) 让我们看一下速度代码语言: javascript copy @Slf4j @RunWith(SpringRunner.class) @SpringBootTest(classes = {ColaDemoApplication.class})class ColaDemoApplicationTests { @Au有线私有 TestRee testRee; @Autowired私有MetricMapper metricMapper; @Test void contextLoads() { List jpaList = new ArrayList<>(); List mybatisList = new ArrayList<>(); for (int i = 0; i < ; i++) { TestJpa testJpa = new TestJpa(); testJpa.setMainMetric(String.format("mainMetric%d", i)); testJpa.setSubMetric(String.format("subMetric%d", i)); testJpa.setUserId(String.format("userId%d", i)); testJpa.setMetricItem(String.format("metricItem%d", i)); jpaList.add(testRe); com.kakki.colademo.gatewayimpl.database.dataobject.TestMybatis testMybatis = new com.kakki.colademo.gatewayimpl.database.dataobject.TestMybatis(); testMybatis.setMainMetric(String.format("mainMetric%d", i)); testMybatis.setSubMetric(String.format("subMetric%d", i)); testMybatis.setUserId(String.format("userId%d", i)); testMybatis.setMetricItem(String.format("metricItem%d" , i)); mybatisList.add(testR); } StopWatch jpa = new StopWatch(); jpa.start(); testRee.saveAll(jpaList); jpa.stop(); log.info("[jpa]{} ms", jpa.getTotalTimeMillis());秒表 m = 新秒表(); m.start(); metricMapper.insertList(mybatisList); m.stop(); log.info("[m]{}ms", m.getTotalTimeMillis()); }} 代码语言:javascript copy 22:35:10.[main] INFO c.e.c.ColaDemoApplicationTests - [jpa]6ms22:35:31.[main] INFO c.e.c.ColaDemoApplicationTests - [m]ms 可以说是不同的。差不多10次了吧?这只是一个数据让我们尝试 0 代码语言:javascript copy 22:36:48。

[main] INFO c.e.c.ColaDemoApplicationTests - [jpa]ms22:37:05。[main] INFO c.e.c.ColaDemoApplicationTests - [m]ms# 再尝试 10w 22:38:49 .[main] INFO c.e.c.ColaDemoApplicationTests - [jpa]0ms22:39:09.[main] INFO c.e.c.ColaDemoApplicationTests - [m]ms 所以你可以看到一个很大的差距,对吧?为什么差距这么大?我们看一下 saveAll() 源代码语言: javascript copy @Transactional@Overridepublic List saveAll(IterableEntity) {Assert.notNull(entities, "Entities can not be null! ”); List 结果 = new ArrayList();for (S 实体 : 实体) {result.add(save(entity));}返回结果;} @Transactional@Overridepublic S save(S entity) {if (entityInformation.isNew(entity)) {em.persist(entity);returnentity;} else {return em.merge(entity);}} 从上面可以看出,save一一进去而且save里面还会判断主键是否为空,也就是n次循环,n次if判断。

那么性能肯定会大大衰减。结论我在网上看到添加以下参数可以成为批处理,但笔者尝试了一下。

根本没用。如果想解决这个问题,需要重写它的saveAll()方法,然后在切片中插入或更新。

这样会有更好的性能。代码语言:javascript 当然,今天我只用jpa的性能来和mybatis进行比较,但是作为一个coder,我知道技术是为业务服务的。

当然,Jpa也有它的优点。比如通过创建一些方法findAllByIdIn(List ids),可以直接获取根据这个条件查询到的列表,也可以使用findAllByOrderIdAndOrderType(String orderId, String orderType),可以说非常方便。

不再需要编写sql,它会自动完成你的查询操作。总结 在开发小项目时,Jpa 肯定比 Mybatis 效率更高,但是由于业务需求迭代更新越来越快,很多东西 Jpa 显然无法满足,而 Sql 也比 MyBatis 更难维护。

所以我更喜欢Mybatis,而且我写的Sql更简单,更容易维护。

【Springboot】JPA与MyBatis的性能对比

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 欧司朗“前行之光”点亮北京大兴国际机场

    欧司朗“前行之光”点亮北京大兴国际机场

    2019年6月,北京大兴国际机场正式启用并进入验收阶段。 万众瞩目的“全球最大”国际机场预计将于9月底正式投入使用。 当这只“凤凰”展翅翱翔时,势必让世界再次惊叹中国基础设施建设的速度。 作为这一基础设施奇迹的参与者之一,欧司朗采用节能数字照明解决方案,帮助北京大

    06-06

  • 纯茶新零售品牌茶石获数千万元天使轮融资,同创伟业独家投资,

    纯茶新零售品牌茶石获数千万元天使轮融资,同创伟业独家投资,

    投资圈(ID:pedaily)据1月25日消息,纯茶文化新零售品牌tea’stone已完成多轮融资。 千万元天使轮融资,同创伟业独家投资。 据茶石总经理胡跃介绍,本轮融资将主要用于门店扩张、供应链升级、团队建设等方面。 Tea'stone成立于2001年,主要销售纯茶饮料。 产品单价在38元至

    06-18

  • 华人健康并购不止

    华人健康并购不止

    中国健康上市后的并购持续了半年多的时间。 中国健康花费数亿真金白银,不停地争夺土地。 根据公司战略,不仅要深耕安徽本地市场,还要聚焦华东地区,扎根长三角地区。 若舟山利康、嘉兴保变的并购完成,公司将正式进军浙江医药零售市场,逐步完成华东市场的拼图。 然而,随着

    06-18

  • 浙江丽水5亿元设立健康产业基金

    浙江丽水5亿元设立健康产业基金

    投资界(ID:pedaily)据11月8日消息,莲都区美容健康产业股权投资基金正式签约,标志着首支美容健康产业基金落地莲都区健康产业基金。 签约现场,莲都区旅游投资发展有限公司与国科西子(海南)私募基金管理有限公司就双方合作进行了深入探讨,随后两家公司代表在签约仪式上

    06-17

  • 风险投资行业辞旧迎新,投资和IPO逐渐解冻回升

    风险投资行业辞旧迎新,投资和IPO逐渐解冻回升

    据外媒报道,经历了低迷的一年后,随着美国和全球经济逐渐复苏,风险投资行业近期重新燃起信心,投资交易日渐火爆。 活跃、饥渴的初创公司正在等待期待已久的现金。    最近几周,风险投资公司开始宽松钱包。 例如,上个月,社交网络广告和软件制造商RockYou获得了1万美元的

    06-18

  • 三星或增加10.5代QD-OLED生产线

    三星或增加10.5代QD-OLED生产线

    三星显示公司10月10日宣布,到今年将投资13.1万亿韩元用于下一代QD显示技术的开发和量产。 生产线投资10万亿韩元,研发投资3万亿韩元。 重点是将现有的 8G 代 LCD 生产线转换为 QD Display。 QD-OLED 是一种混合结构,通过使用蓝色 OLED 作为光源以及顶部的绿色和红色 QD 来转

    06-06

  • 温州科技创新基金新设5支子基金总规模23亿

    温州科技创新基金新设5支子基金总规模23亿

    投资界(ID:pedaily)消息,1月3日上午,温州市委人才科技创新工作会议市集成创新体系建设动员大会如期召开。 会上,温州国有金融资本管理有限公司董事长陈政会见了上海瑞丽投资基金管理有限公司、中信医疗股权投资私募基金管理(北京)有限公司、浙商创业投资有限公司、上海

    06-18

  • 科聪完成A+轮融资,为移动机器人提供整体解决方案

    科聪完成A+轮融资,为移动机器人提供整体解决方案

    据投资界(ID:pedaily)5月29日消息,近日,浙江科聪控制技术有限公司(“科聪”)移动机器人控制系统行业领军企业,完成A+轮融资。 本轮融资由金蚂投资领投,老股东元璟资本继续跟投。 本轮资金将主要用于产能扩张和建设,大幅增加产能,以满足销量爆发和放量的需求。 同时

    06-17

  • 企易云商获得数百万元天使轮融资,致中资本投资

    企易云商获得数百万元天使轮融资,致中资本投资

    据投资界消息,12月29日,投资界从致中资本获悉,企易云商获得致中资本数百万元天使轮融资。   企易云商成立于2007年,公司由在企业级软件领域拥有丰富经验的行业精英组成。 创始人卢尚在企业级软件领域从业10余年,深刻理解行业痛点,拥有服务众多中小微企业的经验。   

    06-17

  • 【清流家族】全品类宠物生活品牌“pidan”完成5000万元B++轮融资

    【清流家族】全品类宠物生活品牌“pidan”完成5000万元B++轮融资

    近日,**清流资本早期项目——全品类宠物生活品牌“pidan”完成1万元B++融资轮融资。 **据了解,本轮融资由金鼎独家投资,资金将主要用于支持和强化宠物全品类定位的供应链,以及投入产品研发。 “pidan”成立于2007年,致力于为全球宠物主人提供集美观与耐用于一体的值得信

    06-17

  • 联讯仪器完成超亿元B+轮融资,兴诚资本领投,

    联讯仪器完成超亿元B+轮融资,兴诚资本领投,

    投资圈(ID:pedaily)4月11日消息,光电测试公司联讯仪器近日正式宣布完成超亿元B+轮融资。 本轮融资由兴城资本领投,华峰测控、中芯国际聚源等行业机构跟投。 据了解,本次募集资金将用于高端光通信和半导体芯片测试仪器设备的研发和迭代,并将持续吸引国内外优秀行业人才加

    06-17

  • 朗鑫创投完成新一期基金募资1.2亿元

    朗鑫创投完成新一期基金募资1.2亿元

    据投资界8月6日消息,朗鑫创投完成新一期基金募资1.2亿元,管理规模2亿元。 人民币。 朗鑫创投专注于早、中期科技创新项目。 团队成员由连续创业者和国内一线机构投资者组成。 投资案例包括千里目自动驾驶、叶浪智能、安酷智芯等,目前基金业绩账面回报超过5倍,LP来自高等院

    06-18