JPA 批量插入较大数据 解决性能慢问题

news2024/11/23 21:13:46

JPA 批量插入较大数据 解决性能慢问题

使用jpa saveAll接口的话需要了解原理:

	@Transactional
	@Override
	public <S extends T> List<S> saveAll(Iterable<S> entities) {

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

		List<S> result = new ArrayList<>();
		// 使用for循环遍历
		for (S entity : entities) {
			result.add(save(entity));
		}

		return result;
	}

	@Transactional
	@Override
	public <S extends T> S save(S entity) {

		Assert.notNull(entity, "Entity must not be null.");
		// 每条数据都会查询之后 做下判断
		if (entityInformation.isNew(entity)) {
			em.persist(entity);
			return entity;
		} else {
			return em.merge(entity);
		}
	}

	public boolean isNew(T entity) {

		ID id = getId(entity);
		Class<ID> idType = getIdType();

		if (!idType.isPrimitive()) {
		     // 如果id有值,则认为不是新数据,则更新操作,否则就是写入操作
			return id == null;
		}

		if (id instanceof Number) {
			return ((Number) id).longValue() == 0L;
		}

		throw new IllegalArgumentException(String.format("Unsupported primitive id type %s", idType));
	}

以上是jpa源码,所以导致写入数据很慢。因为for遍历一行一行数据写入,而且还要判断;

以下为亲测两种解决方案:

第一种: 自己编写写入逻辑,引入 EntityManager entityManager,代码如下
批量写入一批数据。一次事务提交一批。


    @Value("${spring.jpa.properties.hibernate.jdbc.batch_size:1000}")
    private int batchSize;

    @PersistenceContext
    private EntityManager entityManager;

    public <T> void batchInsert(List<T> list) {
        if (!ObjectUtils.isEmpty(list)){
            for (int i = 1; i <= list.size(); i++) {
                // 写入操作
                entityManager.persist(list.get(i - 1));
                if (i % batchSize == 0) {
                    entityManager.flush();
                    entityManager.clear();
                }
            }
            if (list.size() % batchSize != 0) {
               //flush() 同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。
                entityManager.flush();
               //clear() 清除持久上下文环境,断开所有关联的实体。如果这时还有未提交的更新则会被撤消。
                entityManager.clear();
            }
        }
    }

    public <T> void batchUpdate(List<T> list) {
        if (!ObjectUtils.isEmpty(list)){
            for (int i = 1; i < list.size(); i++) {
                entityManager.merge(list.get(i - 1));
                if (i % batchSize == 0) {
                    entityManager.flush();
                    entityManager.clear();
                }
            }
            if (list.size() % batchSize != 0) {
                entityManager.flush();
                entityManager.clear();
            }
        }
    }

第二种:不需要自己编写逻辑,使用jpa saveAll()方法
开启JPA批处理
在这里插入图片描述

jpa 表映射@Table 下对主键使用序列,postgre支持创建序列,可以使用,其他数据源不一定。

    @GeneratedValue(strategy = SEQUENCE, generator = "seqGen")
    @SequenceGenerator(name = "seqGen", sequenceName = "seq", initialValue = 1)

这样做的逻辑saveAll()不需要判断isNew,直接走em.persist(entity);

两种的性能差不多,记录下

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

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

相关文章

建设Web3需要Web2的人才?探索传统技能在Web3时代的作用

摘要&#xff1a;Web3作为下一代互联网技术的前沿&#xff0c;许多人关注着它的发展和应用。然而&#xff0c;建设Web3是否需要Web2的人才仍然是一个有争议的问题。 Web3作为下一代互联网技术&#xff0c;以去中心化、智能合约和用户自治等特点引起了广泛的关注。与此同时&…

基于STM32单片机的智能家居毕设

文章目录 一、硬件选型1、硬件清单2、硬件展示&#xff08;部分&#xff09; 二、效果展示1、整体效果展示2、显示屏&#xff08;触摸&#xff09;效果展示 三、功能分析1、系统总体结构框图2、主要包含的功能 四、怎么做&#xff1f;1、STM32单片机部分2、语音识别与播报部分3…

wamp环境解决局域网不能访问的问题!

安装好wamp后&#xff0c;想用手机通过局域访问电脑上wamp下的网页&#xff0c;结果出现如下提示403错误&#xff1a; 第一步&#xff1a;找到 conf 这个文件&#xff1a; 找到下图中红色方框中的onlineoffline tag - don’t remove&#xff0c;将原来的Require local替换为Re…

JMeter:如何开始简单的WEB压力测试?

目录 背景 如何开始简单的WEB压力测试 PutsReq网站截图 执行测试计划 背景 JMeter是一款广泛使用的性能测试工具&#xff0c;它可以模拟用户行为并生成负载&#xff0c;用于评估Web应用程序的性能和稳定性。 最近工作上被安排针对Web网站进行性能压测&#xff0c;以评估特…

chatgpt赋能python:关于Python除二取余法的优缺点分析

关于Python除二取余法的优缺点分析 Python是当前数据分析和科学计算最火热的语言之一&#xff0c;其中除二取余法是Python中很有趣的算法之一。它也是很常用的基础算法之一&#xff0c;特别是在图像处理和编码中&#xff0c;非常常用。除二取余法指的是一个数值除以二后的余数…

『手撕 Mybatis 源码』09 - MyBatis 插件

MyBatis插件 概述 问题&#xff1a;什么是Mybatis插件&#xff1f;有什么作用&#xff1f; Mybatis插件本质上来说就是一个拦截器&#xff0c;它体现了 JDK 动态代理和责任链设计模式的综合运用 Mybatis 中所允许拦截的方法如下 Executor 【SQL执行器】【update&#xff…

深信服行为感知系统远程命令执行

什么是男子汉?困难打不倒的人才是真正的男子汉&#xff01; 漏洞复现 构造payload访问漏洞url&#xff1a; /tool/log/c.php?strip_slashessystem&hostipconfig漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢…

linux服务器python2升级安装python3.7环境

文章目录 开始1. 首先&#xff0c;先检查自己的系统是否安装了python32. 如果你只是想安装python3.63. 安装python3.7的准备工作4. 安装python35. 添加软链接&#xff0c;让python3和pip3这两个命令指向刚刚安装的python3.76. 检验python3安装是否ok7. 更新默认 Python 版本8. …

Spring管理事务知识

目录 1.什么是事务 2.事务的特性ACID 3.Spring 管理事务的方式 4.Spring管理事务的体现&#xff1a;JDBCTemplate 5.声明式事务的属性有哪些 6.声明式事务属性---只读 7.声明式事务属性---超时 8.声明式事务属性---回滚策略 9.声明式事务属性---事务隔离级别 10.声明…

mac 安装 aab android包

一、配置bundletool环境 1、下载最新版的bundletool 版本号要最新的 bundletool-all-1.15.1.jarhttps://github.com/google/bundletool/releases/download/1.15.1/bundletool-all-1.15.1.jar Releases google/bundletool GitHub​​​​​​​​​​ 2、把bundletool放在…

简要介绍 | 基于Diffusion model的图像生成和重建

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于Diffusion model的图像生成和重建进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 基于Diffusion model的图像生成和重建 What are Stable Diffusion Models and Why are they a Step Forw…

Hyperledger Fabric架构设计

目录 1、逻辑架构 答疑&#xff1a;什么叫做背书策略&#xff1f; 2、运行时架构 答疑&#xff1a;什么是锚节点&#xff1f; 1、逻辑架构 Hyperledger Fabric从1.X开始&#xff0c;在扩展性及安全性方面有了很大的提升&#xff0c;且新增了诸多特性。 多通道&#xff1a;支…

【carla】carla仿真环境安装与运行

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍carla仿真环境安装与运行。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

文心一言 VS 讯飞星火 VS chatgpt (51)-- 算法导论6.2 3题

三、当元素 A[i] 比其孩子的值都大时&#xff0c;调用 MAX-HEAPIFY(A.i)会有什么结果? 文心一言&#xff1a; 当元素 A[i] 比其孩子的的值都大时&#xff0c;调用 MAX-HEAPIFY(A, i) 会将 A[i] 与其孩子中的最小值进行交换&#xff0c;并将 A[i] 视为新的根节点。这个操作会…

解决no main manifest attribute, in XXX.jar

解决no main manifest attribute, in XXX.jar 1. 问题描述1.1 前言1.2 问题描述 2. 问题原因3. 解决问题3.1 修改pom文件3.2 重新启动3.3 再次查看META-INF/MANIFEST.MF3.4 小结 1. 问题描述 1.1 前言 创建一个简单的maven项目&#xff0c;pom配置如下&#xff1a; 1.2 问题…

若依-vue图片上传本地改OSS前台以及后台-附带oss图片上传工具类

阿丹&#xff1a; 在二次开发若依的过程中发现若依的图片上传的默认的是在本地&#xff0c;在spring-vue版本中&#xff0c;如果要将平台上线那么就需要考虑这个问题&#xff0c;要使用fastdfs或者oss来完成代替本地的图片上传。 本篇文章我使用了oss来完成图片上传以及前台的…

【零基础入门学习Python---Python网络编程之django快速入门实践】

&#x1f680; Python &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

mac 文件批量重命名001开始

mac 文件批量重命名001开始&#xff0c;怎么操作&#xff1f;我们平时在整理办公文件的时候&#xff0c;经常需要对文件的名称进行修改&#xff0c;将文件修改为数字形式的名称&#xff0c;例如001、002、003、004......这样的形式&#xff0c;尤其是某项工作涉及非常多文件的时…

Spring Boot 中的 WebSocket 是什么,原理,如何使用

Spring Boot 中的 WebSocket 是什么&#xff0c;原理&#xff0c;如何使用 前言 WebSocket 是一种支持双向通信的网络协议&#xff0c;可以让客户端和服务器之间实现实时通信。Spring Boot 提供了对 WebSocket 的支持&#xff0c;可以方便地在应用程序中实现实时通信功能。本…

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…