首页 > 其他分享 >JPA批量新增,批量更新

JPA批量新增,批量更新

时间:2024-02-21 13:11:09浏览次数:24  
标签:entityManager 批量 JPA list 新增 更新 entity result

jpa的sava与saveAll

save()方法

@Transactional
   public <S extends T> S save(S entity) {
       if (this.entityInformation.isNew(entity)) {
           this.em.persist(entity);
           return entity;
       } else {
           return this.em.merge(entity);
       }
   }

根据源码我们可以看出来,save是先通过判断这个对象是不是新的,新的便会新增,否则就是执行的修改。整个是有分两步进行的,先查询再新增

saveAll()方法

@Transactional
  public <S extends T> List<S> saveAll(Iterable<S> entities) {
      Assert.notNull(entities, "The given Iterable of entities not be null!");
      List<S> result = new ArrayList();
      Iterator var3 = entities.iterator();
      while(var3.hasNext()) {
          S entity = var3.next();
          result.add(this.save(entity));
      }
      return result;
  }

saveAll()方法是一种更新多条的一种方式,里面传的存对象的集合。分析源码我们可以看出saveAll()底层还是调用的save()方法,也就是每次需要先查询再做修改。在使用上方便,但是因每次涉及到查询、新增,事务的关系,导致修改或者新增耗时得非常的久。

那么下面我们将结合EntityManager对批量新增,修改做出优化。

jpa结合Batch

配置文件

spring:
  #配置 Jpa
  jpa:
    properties:
      hibernate:
        generate_statistics: false
        order_insert: true    //配置批量新增
        order_update: true    //配置批量修改
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
        jdbc:
          batch_size: 1000    //容器内批量的大小
    open-in-view: true

EntityManager

EntityManager其实就是一个容器,通过注解引入EntityManager对象 使用EntityManager对新增,修改进行批量处理

/**
 * @author 程序员panda
 * @date 
 * @desc 批量处理
 */
@Service
@Transactional
public class BatchService {
    @PersistenceContext
    private EntityManager entityManager;
    //配置文件中每次批量提交的数量
    @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}")
    private long batchSize;
    /**
     * 批量插入
     *
     * @param list 实体类集合
     * @param <T>  表对应的实体类
     */
    public <T> void batchInsert(List<T> list) {
        if (!ObjectUtils.isEmpty(list)){
            for (int i = 0; i < list.size(); i++) {
                entityManager.persist(list.get(i));
                if (i % batchSize == 0) {
                    entityManager.flush();
                    entityManager.clear();
                }
            }
            entityManager.flush();
            entityManager.clear();
        }
    }
    /**
     * 批量更新
     *
     * @param list 实体类集合
     * @param <T>  表对应的实体类
     */
    public <T> void batchUpdate(List<T> list) {
        if (!ObjectUtils.isEmpty(list)){
            for (int i = 0; i < list.size(); i++) {
                entityManager.merge(list.get(i));
                if (i % batchSize == 0) {
                    entityManager.flush();
                    entityManager.clear();
                }
            }
            entityManager.flush();
            entityManager.clear();
        }
    }
}

实际运用

选择一个需要新增的table,将原有的saveAll(),改为调用自定义的batchInsert()方法

 public JSONObject sumbitPhone(MultipartFile phoneFile) {
        long timeIdStart = System.currentTimeMillis();
        JSONObject result=new JSONObject();
        List<CheckPhone> phoneList=getPhoneListEn(phoneFile);
        batchService.batchInsert(phoneList);
        result.put("code",200);
        result.put("msg","提交成功");
        logger.info("提交预校验数据用时:"+(System.currentTimeMillis() - timeIdStart) / 1000.0+"秒");
        return result;
    }

注意

使用batch批量新增的时候,表的主键不能使用自增的形式,需要使用uuid来才能使用批量的新增

运行时间对比

使用saveall()方法耗时(提交1000个号码文件) 从sql监控中可以看到,新增1000个号码,执行了7.962秒,执行了1000次的事务,都是一个个提交的

使用batch批量新增(同为1000个号码)此时执行,提交了两次,执行了两次事务。因为我设置了batch_size为1000。此时用是196毫秒。看一看出他是按999条数据,然后统一提交的

总结

到此这篇关于使用SpringBoot和JPA实现批量处理新增、修改的文章就介绍到这了。

 

标签:entityManager,批量,JPA,list,新增,更新,entity,result
From: https://www.cnblogs.com/oumi/p/18024964

相关文章

  • 布客深度学习译文集 2024.2 更新
    Sklearn、TensorFlow与Keras机器学习实用指南第三版Sklearn与TensorFlow机器学习实用指南第二版PyTorch自然语言处理Transformer和扩散模型的生成式AI实用指南(预览版)Transformer自然语言处理面向程序员的FastAI和PyTorch深度学习TensorFlow学习手册Tensor......
  • solidity实现批量转账
    直接贴代码://SPDX-License-Identifier:MITpragmasolidity^0.8.0;contractBatchTransfer{eventTransfer(addressindexedfrom,addressindexedto,uint256value);constructor()payable{}functionbatchTransfer(addresspayable[]memory_r......
  • windows server 2019/2022安装WSUS更新服务器配置System.Runtime.InteropServices.COM
    现象: 2024-02-1814:41:10Postinstallstarted2024-02-1814:41:10Detectedroleservices:Api,UI,WidDatabase,Services2024-02-1814:41:10Start:LoadSettingsFromXml2024-02-1814:41:10Start:GetConfigValuewithfilename=UpdateServices-Services.xmlit......
  • C#Sqlite插入/更新并返回数据
    关键词:returning返回所有列:returning*;返回指定列:returningcolumnname;删除命令不支持returning参考代码:stringpath=@"DataSource=D:\Data\data.sqlite;Version=3";using(SQLiteConnectionconn=newSQLiteConnection(path)){conn.Open();stringsql=......
  • odoo安装模块报错& 更新postgresql数据库
    在本地win11环境下部署了一个odoo17,一开始还好好的,运行几次之后,每次登录就会报错,安装模块时也会报错。一开始,服务器的报错信息提示keyerror:mail.... 个人判断应该是缺少模块,在尝试安装了邮件营销的模块后恢复正常。但是随后尝试别的模块时又开始报错。网页前端和服务......
  • CF-928(已更新:B C E)
    CF-928排名四千多,目前为止排名最高的一场~E题我赛时基本上是猜的结论(但是也推了快一小时才想到有这个可能性),因此目前只能放个码在这(⊙﹏⊙)D的话问了学长思路,正在补了0-^-0……但是上一场牛客打得特别烂(⊙﹏⊙),还是等我补了牛客的再更新吧-^-B分析观察它的性质,答案为正方......
  • 02 SQL更新语句执行流程
    02SQL更新语句执行流程与查询流程不一样的是,更新流程还涉及两个重要的日志模块。​redolog(重做日志)和binlog(归档日志)​redolog物理日志binlog逻辑日......
  • 一条SQL更新了整个表,如何回退
    背景:我们的一些业务测试系统,数据库一般也是由开发同事自行维护,所以不可避免会有一些问题,经常会有开发同事火急火燎的打电话给我们,如果语气急切,态度恭谨,一般就是误操作数据了(八九不离十)。最近我们就遇到了一起误更新数据的事件。由于update SQL编写问题,开发同事将整个表的一个......
  • ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年
    Promise.withResolvers使用Promise.withResolvers()关键的区别在于解决和拒绝函数现在与Promise本身处于同一作用域,而不是在执行器中被创建和一次性使用。这可能使得一些更高级的用例成为可能,例如在重复事件中重用它们,特别是在处理流和队列时。这通常也意味着相比在执行器内......
  • 热更新 Creator 3.x 原生平台热更新(转载)
    使用版本:3.7.1功能介绍:基于官方demo修改步骤:1.下载官方demohttps://github.com/cocos-creator/cocos-tutorial-hot-update/tree/master 1522.搭建测试服务器https://cloud.tencent.com/developer/article/1987932 92开启默认端口是8080,启动的时候可以http-server-p端口号来修......