Spring Data JPA - 批量插入实例

之前写过两篇博文讲解了之前项目中如何使用JPA批量插入:

Spring Data JPA批量插入过慢及其优化 —— 自定义Repository_Lazyafei的博客-CSDN博客_jpa批量插入优化

Spring Data JPA批量插入过慢及其优化 —— 泛型提炼公用batchSave方法、引入多线程_Lazyafei的博客-CSDN博客

今天举个例子,并把源码放出来,项目使用国产神通数据库,其他数据库请自行修改。

GitHub: lazyafei/spring-data-jpa-practice Gitee地址:lazyafei/spring-data-jpa-practice

由于JPA自身机制(详情移步:Spring - Saving Entities),批量插入本质是单条单条进行插入,从这种机制而言就难以快速插入数据。并且在插入单条数据的同时还会调用isNew方法判断是否是新增数据,导致插入数据稍多一些就明显感觉慢。

在不拼接sql批量插入的情况下有以下优化措施:

1、开启JPA批量操作(需要保证实体id不是自增主键GenerationType.IDENTITY)

spring:
  #配置JPA
  jpa:
    database: ORACLE
    hibernate:
      naming_strategy: org.hibernate.cfg.DefaultNamingStrategy
    properties:
      hibernate:
        format_sql: false
        jdbc:
          batch_size: 1000
          batch_versioned_data: true
        order_inserts: true
        order_updates: true
        show_sql: true

2、重写save方法,避免isNew判断

3、多线程处理,性能瓶颈在于数据库 (需要注意BatchSaveRepository.java中batch_size与max_thread大小的设置,一般来说batch_size设置为1000左右,max_thread设置为cpu核心数*2);

//每个线程分的数据量
private final Integer BATCH_SIZE = 1500;
//最大线程数(建议最大电脑核心数*2)
private final Integer MAX_THREAD = 4;

对比图(效率基本提升1倍): 

1W数据:

开启JPA批量:(9.4s)

引入多线程:(5s)

2W数据:

开启JPA批量:(19s)

引入多线程:(10s) 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值