java jpa saveall方法优化_JPA批量插入(saveAll)

有时候要从第三方导入数据,一般量都比较大,除了方法用异步线程@Async之外,如果每条记录都调用一次save显然对数据库压力很大。可以使用JPA的批量保存方法saveAll(Iterable entities)。

由于JPA的批量保存和批量修改是同一个方法,所以本文也适用批量修改操作。

一、Entity改造

增加3个注解,方便在Controller类build方式构造对象。

@Builder

@NoArgsConstructor

@AllArgsConstructor

完整注解:

@Data

@Builder

@NoArgsConstructor

@AllArgsConstructor

@ApiModel("休息日,休息日可能不处理业务,备用")

@Entity

@Table(name = "bz_setup_restday", schema = "bankrouter")

public class BzSetupRestdayEntity implements Serializable {

......

二、Repository

package com.pay.payee.repository;

import com.pay.payee.entity.BzSetupRestdayEntity;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Date;

/**

*

休息日,休息日可能不处理业务,备用(BzSetupRestday)表数据库访问层

*

* @author 郭秀志 jbcode@126.com

* @since 2020-05-08 23:50:43

*/

public interface BzSetupRestdayRepository extends JpaRepository {

}

三、Service实现类

关键方法saveAll(Iterable entities)。

package com.pay.payee.service.impl;

import com.pay.payee.entity.BzSetupRestdayEntity;

import com.pay.payee.repository.BzSetupRestdayRepository;

import com.pay.payee.service.IBzSetupRestdayService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.util.Date;

import java.util.List;

import java.util.Optional;

/**

*

休息日,休息日可能不处理业务,备用(BzSetupRestday)表服务实现类

*

* @author 郭秀志 jbcode@126.com

* @since 2020-05-08 23:50:43

*/

@Service("bzSetupRestdayService")

public class BzSetupRestdayServiceImpl implements IBzSetupRestdayService {

@Autowired

private BzSetupRestdayRepository bzSetupRestdayRepository;

@Override

public void save(BzSetupRestdayEntity bzSetupRestdayEntity) {

bzSetupRestdayRepository.save(bzSetupRestdayEntity);

}

public List saveAll(Iterable entities) {

return bzSetupRestdayRepository.saveAll(entities);

}

}

四、Controller

60000条数据使用方法saveAll(Iterable entities)进行批量保存。

package com.pay.payee.controller;

import com.pay.payee.entity.BzSetupRestdayEntity;

import com.pay.payee.service.IBzSetupRestdayService;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

/**

* 休息日,休息日可能不处理业务,备用(BzSetupRestday)表控制层

*

* @author 郭秀志 jbcode@126.com

* @since 2020-05-08 23:50:43

*/

@RestController

@RequestMapping("/bzSetupRestday")

public class BzSetupRestdayController {

/**

* 服务对象

*/

@Resource

private IBzSetupRestdayService bzSetupRestdayService;

/*

* @Description 批量保存

* @Param [entities]

* @return java.util.List

*/

@GetMapping("/saveAll")

public List saveAll() {

long begin = System.currentTimeMillis();

List list = new ArrayList();

for (int i = 0; i < 60000; i++) {

BzSetupRestdayEntity build = BzSetupRestdayEntity.builder().groupId("1").restDate(new Date()).useType("2").build();

list.add(build);

}

List sList = (List) bzSetupRestdayService.saveAll(list);

long end = System.currentTimeMillis();

System.out.println("时长:" + (end - begin));

return sList;

}

}

五、调用url测试

http://localhost:8555/bzSetupRestday/saveAll

控制台输出耗时(毫秒):时长:15958

网上个别人遇到saveAll速度慢,添加了如下配置信息解决。我实测速度无差别。

spring:

jpa:

properties:

hibernate:

#打印执行时间统计信息

generate_statistics: true

jdbc:

#每批500条提交

batch_size: 500

batch_versioned_data: true

order_inserts: true

order_updates: true

六、批量保存优化

6.1 背景

有次实践是有20万左右的数据要批量的插入,速度非常慢,发现打印出来的sql是先select一次,再insert。

6.2 速度慢原因

原生的saveAll()方法可以保证程序的正确性,但是如果数据量比较大效率低,看下源码就知道其原理是 for 循环每一条数据,然后先select一次,如果数据库存在,则update。如果不存在,则insert。

6.3. saveAll源码

SimpleJpaRepository的saveAll(Iterable entities)方法源码如下:

@Transactional

public List saveAll(Iterable entities) {

Assert.notNull(entities, "Entities must not be null!");

List result = new ArrayList();

Iterator var3 = entities.iterator();

while(var3.hasNext()) {

S entity = var3.next();

result.add(this.save(entity));//save方法是核心逻辑

}

return result;

}

@Transactional

public S save(S entity) {

if (this.entityInformation.isNew(entity)) {

this.em.persist(entity);

return entity;

} else {

return this.em.merge(entity);

}

}

6.4 解决方案

6.4.1 批量插入

解决方案是自己用em进行持久化插入,省了一步查询操作。

@PersistenceContext

private EntityManager entityManager;

@Override

@Transactional(rollbackFor = Exception.class)

public void addBatch(List list) {

for (ProjectApplyDO projectApplyDO : list) {

entityManager.persist(projectApplyDO);//insert插入操作

}

entityManager.flush();

entityManager.clear();

}

6.4.2 批量更新

在确保数据已经存在的情况下,如果是批量更新可以如下代码代替上面的entityManager.persist(projectApplyDO);语句:

entityManager.merge(projectApplyDO);//update更新操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js截取字符串的后几位数 省份证号*隐藏

js截取字符串的后几位数 代码如下&#xff1a; var str"abcdefghhhh";//截取后4位 str.substring(str.length-4)&#xff1b; js * 代替 var str ’331023187609300311‘&#xff1b; //18位省份证号 前三位显示中间10位有8个*代替后5位显示 331********00…

java 单一职责原则_设计模式之单一职责原则

对类来说&#xff0c;即一个类应用只负责一项职责&#xff0c;如类A负责两个不同的职责&#xff1a;职责1&#xff0c;职责2.当职责1需求变更时&#xff0c;可造成职责2执行错误&#xff0c;所以需要将类A的粒度分解为A1&#xff0c;A2.降低类的复杂度&#xff0c;一个类只负责…

TypeScript 2.0 正式发布

9 月 22 日&#xff0c;TypeScript 2.0 正式发布了。 TypeScript 是微软开发的开源的编程语言&#xff0c;主要负责人是 C# 之父 Anders Hejlsberg。 TypeScript 成功将 JavaScript 的潜能与静态类型结合了起来&#xff0c;而且编译为 JavaScript。编译时类型检查可以避免很多潜…

Tomcat server.xml配置示例

转载自 Tomcat server.xml配置示例几乎所有容器类型的应用都会包含一个名为 server.xml 的文件结构。基本上&#xff0c;其中的每个元数据或者配置都是容器完成初始化所需要的。正是由于这些内容都是可配置的&#xff0c;使得软件设计者或架构师可以在容器运行时或销毁时&am…

日志-周报-月报(2019年2月)

20190203 1.马氏距离找公式 2.ruby先不看吧&#xff0c;先java学着到联通没办法在写ruby 3.舔狗&#xff0c;ppt&#xff0c;进公司考智商&#xff0c;升职靠情商。 4.看德哥看了一天 5.没了 6.联通调岗做销售&#xff0c;华为不续签合同&#xff0c;ppt文化哪家都一样&a…

怎么用php配合js编写动态页面_JavaScript_JavaScript教程:用JS脚本实现Web页面信息交互范例,要实现动态交互,必须掌握有 - phpStudy...

要实现动态交互&#xff0c;必须掌握有关窗体对象(Form)和框架对象(Frames)更为复杂的知识。三、范例下面我们演示通过点击一个按钮(red)来改变窗口颜色&#xff0c;点击“调用动态按钮文档”调用一个动态按钮文档。test8_1.htm//原来的颜色document.bgColor"blue";d…

SignalR的性能监测与服务器的负载测试

前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的负载测试 我们开发任何一个应用,他的性能监测是很重要的参考数据,关系着我们后期优化,更新,改动..等等... SignalR作为…

在Tomcat配置JNDI数据源的三种方式

转载自 在Tomcat配置JNDI数据源的三种方式在我过去工作的过程中,开发用服务器一般都是Tomcat&#xff0c;数据源的配置往往都是在applicationContext.xml中配置一个dataSource的bean&#xff0c;然后在部署时再修改JNDI配置。我猜是因为Tomcat的配置需要改配置文件&#xff0…

毕业设计word 表格标题 图表标题

图一模一样 生成目录 ************************************************************************************************************************* 生成表目录和图目录 *********************************************************************************************…

php打印 二维数组,PHP中遍历二维数组_以不同形式的输出操作实例

//定义二维索引数组$arr array(array("101","李军","男","1976-02-20","95033"),array("103","陆君","男","1974-06-03","95031"),array("105","匡明&q…

Ubuntu 16.04下ASP.NET Core+ MySql + Dapper在 Jexus、nginx 下的简单测试

一、环境及工具 1、服务器 VirtualBox5.1.4 安装 Ubuntu Server 16.04 amd64MySql Ver 14.14 Distrib 5.6.21Jexus 5.8.1nginx 1.10.0dotnet core 1.0.0-preview2-003121supervisor 3.2.1 2、开发环境 VS2015 Update 3DotNetCore.1.0.0-VS2015Tools.Preview2.0.1.exe 3、测试工…

jsp九大隐藏对象

转载自 jsp九大隐藏对象&#xfeff;&#xfeff;jsp内置对象&#xff08;隐藏对象&#xff09;&#xff1a;不加声明和创建就可以在jsp页面脚本中使用的成员对象。 内置对象类型作用域requestjavax.servlet.http.HttpServletRequestrequestresponsejavax.servlet.http.HttpS…

新闻发布项目——数据库脚本(直接导入即可)

数据库sql servel 2012版本&#xff0c;以下是脚本&#xff1a; USE [master] GO /****** Object: Database [newsDB] Script Date: 2016/11/24 19:48:46 ******/ CREATE DATABASE [newsDB]CONTAINMENT NONEON PRIMARY ( NAME NnewsDB, FILENAME NE:\第二期\第六本书使…

最新版Intellij IDEA视频教程 20170814

01课程介绍和软件安装.avi 02Intellij IDEA常用快捷键1132.avi 03Intellij IDEA安装Tomcat和Maven.avi 04Intellij IDEA使用Maven Helper插件分.avi 05Intellij IDEA中Git安装和使用.avi 06Intellij IDEA连接MySQL数据库.avi 07Intellij IDE使用GsonFormat转化json.avi …

Docker容器环境下ASP.NET Core Web API应用程序的调试

本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件&#xff0c;在Docker容器环境下&#xff0c;对ASP.NET Core Web API应用程序进行调试。在自己做实验的过程中也碰到了一些问题&#xff0c;经过一些测试和搜索资料&#xff0c;基本解决了这些问题&#xf…

php 查看spl,PHP使用标准库spl实现的观察者模式示例

本文实例讲述了PHP使用标准库spl实现的观察者模式。分享给大家供大家参考&#xff0c;具体如下&#xff1a;前面使用纯php实现了一个观察者模式(php观察者模式)&#xff0c; 现在使用php标准库spl在次实现观察者模式&#xff0c;好处是&#xff1a;随意的生成您想使用的观察者&…

深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会

转载自 深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会自定义标签&#xff0c;顾名思义&#xff0c;就是自己定义的标签。那么我们为什么要自己定义一些标签呢&#xff1f; 我们知道&#xff0c;如果要在JSP中获取数据我们可以采用通过JSP的隐式对象request来…

ps查看所有php进程,ps命令就是最基本进程查看命令

1、ps是什么&#xff1f;要对进程进行监测和控制&#xff0c;首先必须要了解当前进程的情况,也就是需要查看当前进程&#xff0c;ps命令就是最基本进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等…

如何测试微信应用号

每一次微信的动作都是商机&#xff0c;而随着微信应用号的即将面世&#xff0c;微信应用号的开发和测试又会成为一股新的风向。 其实经常有人问到微信服务号或者微信订阅号怎么测试的相关内容&#xff0c;可能总觉得比较缺乏技术含量不太想说&#xff0c;这次看了下应用号&…

git 拉代码

git clone 。。 拉取代码master git clone -b 分支名 。。。 拉取分支名 git——更新分支、提交代码、切换分支、合并分支 还是直接贴教程吧&#xff1a;https://git-scm.com/book/zh/v2 如何把本地idea上的项目上传到github上&#xff1a;https://www.cnblogs.com/…