iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解决spring data jpa saveAll() 保存过慢问题
  • 265
分享到

解决spring data jpa saveAll() 保存过慢问题

2024-04-02 19:04:59 265人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录spring data jpa saveAll() 保存过慢问题发现解决方案1 此方案在第二天失效了以上方案有问题,下面附上彻底解决的截图和记录JPA的saveAll方法执行效率

spring data jpa saveAll() 保存过慢

问题发现

今天在生产环境执行保存数据时 影响队列中其他程序的运行 随后加日志排查 发现 执行 4500条 insert操作时 耗时 9分钟 我类个去…

解决方案1 此方案在第二天失效了

废话不多说 直接上配置文件参数

application-prod.yml 部分参数如下


  jpa:
  show-sql: false
  hibernate:
    ddl-auto: none
  properties:
    hibernate:
      jdbc:
        #为spring data jpa saveAll方法提供批量插入操作 此处可以随时更改大小 建议500哦
        batch_size: 500
        batch_versioned_data: true
        order_inserts: true

通过日志打印 执行结果如下

未开批处理 4507条 耗时: 227167ms

开启批处理 500/次 4507条 耗时: 29140ms

开启批处理 1000/次 4507条 耗时: 29631ms

以上方案有问题,下面附上彻底解决的截图和记录

后来发现在生产运行了一天 还是会导致保存阻塞的问题 100条保存耗时 9分钟!!!

数据库此时数据有300w条

于是分析 saveAll()的源代码

在这里插入图片描述

在这里插入图片描述

原来这个保存的时候 会去数据库查询这条数据是否存在 如果存在 则修改 不存在则直接添加 如下图

在这里插入图片描述

重写 saveAll() 的方法 就是仿照它 for循环里面直接调用 save()方法


 @PersistenceContext()
 protected EntityManager em;

在这里插入图片描述

此处你们可以改成泛型的方式,提取公共类,封装一下即可。

JPA的saveAll方法执行效率很差

SpringBoot项目中使用了SpringDataJpa的技术,很方便,省了很多dao层繁琐的步骤,但是有一个接口需要批量更新或者插入,数据量挺大,大概1-2w条,每条记录20-30个字段吧,对于刚工作不久的我还是比较大的。我开始使用的saveAll(),因为本地单元测试,也没考虑那么多(其实更早期更蠢,遍历再save,压根不去考虑数据库连接池的压力或者说每次遍历都要去连接数据库的时间损耗…),但是客户压力测试,我的接口就拉胯了。接口等待时间太久…诶

刚开始的思路想解决saveAll方法为什么这么慢的问题,因为saveAll是有则更新,无则新增,所以每条记录都要去比对该记录是否存在表中,效率比较差(我以后还是用JPA去适应数据量较小的吧,jpa可能还有什么别的路子后面可以配置进去也行)。

最后改用了mybatis的foreach方式,虽然比较老套而且肯定不是最快的办法,但是还是实用。

使用过程中,出现了这个报错:

Packet for query is too large (3227 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.

应该是一下子丢进来的数据太大,超过了Mysql的限制,有人说通过修改数据库的max_allowed_packet这个属性来修改,不过我这里是jenkins部署的服务器,能操作到数据库的只有navicat这个可视化工具,如果使用命令行修改这个属性,好像只能暂时起效。我只好类似分页,把18000条数据按照2000一次批量操作,分成9次,这样既不会报错,也会比savelAll快一些。后续再研究一下更快更高效的方法。

数据库配置加上allowMultiQueries=true才会支持foreach循环操作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解决spring data jpa saveAll() 保存过慢问题

本文链接: https://www.lsjlt.com/news/158080.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决spring data jpa saveAll() 保存过慢问题
    目录spring data jpa saveAll() 保存过慢问题发现解决方案1 此方案在第二天失效了以上方案有问题,下面附上彻底解决的截图和记录JPA的saveAll方法执行效率...
    99+
    2024-04-02
  • 解决spring data jpa 批量保存更新的问题
    spring data jpa 批量保存更新问题 使用jpa批量保存时,看日志发现是一条一条打印的,然后去看了下源码,果然是循环调用的单个保存(巨坑啊) 经查询jpa是可以实现批量...
    99+
    2024-04-02
  • 解决spring-data-jpa mysql建表编码问题
    使用InnoDB引擎 UTF8编码 创建配置类: import org.hibernate.dialect.MySQL5InnoDBDialect; import org.hib...
    99+
    2024-04-02
  • 解决spring-data-jpa 事物中修改属性自动更新update问题
    问题还原 项目orm层用的是spring-data-jpa,服务端接口实现的是树节点间的拖拽功能,测试环境联调发现异常问题,其中拖拽到目标目录后节点名称总会重名,重名规则是origi...
    99+
    2024-04-02
  • jpa entitymanager缓存问题如何解决
    JPA EntityManager的缓存问题可以通过以下几种方式解决:1. 清除缓存:可以使用EntityManager的clear...
    99+
    2023-10-18
    jpa
  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题
    目录Spring Data Jpa 实体类自动创建数据库表失败找了半天发现是一个配置的问题可能导致JPA 无法自动建表的问题汇总1、没加@Entity或引错Entity所在包2、jp...
    99+
    2024-04-02
  • 如何解决mysql存储过程太慢的问题
    小编给大家分享一下如何解决mysql存储过程太慢的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql存储过程太慢的解决...
    99+
    2024-04-02
  • 如何解决spring-data-jpa事物中修改属性自动更新update问题
    小编给大家分享一下如何解决spring-data-jpa事物中修改属性自动更新update问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题还原项目orm层用...
    99+
    2023-06-20
  • spring data jpa开启批量插入、批量更新的问题解析
    最近准备上spring全家桶写一下个人项目,该学的都学学,其中ORM框架,最早我用的是jdbcTemplate,后来用了Mybatis,唯独没有用过JPA(Hibernate)系的,...
    99+
    2024-04-02
  • 怎么解决mysql连接过慢的问题
    这篇文章主要讲解了“怎么解决mysql连接过慢的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决mysql连接过慢的问题”吧! 3种解决方法(前...
    99+
    2024-04-02
  • 解决pip下载速度过慢的问题
    文章目录 前言一、问题分析二、解决办法1.下载时加入参数 -i [镜像源地址]2.设置源3.国内镜像源地址 前言 在做项目的时候,我们会发现单纯的使用 pip 安装插件或模块,下载速...
    99+
    2023-09-12
    pip python 深度学习
  • mysql limit分页过慢的问题如何解决
    本篇内容主要讲解“mysql limit分页过慢的问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql limit分页过慢的问题如何解决”吧!1、使用表的覆盖索引加速分页查询。由...
    99+
    2023-06-20
  • Spring JPA增加字段执行异常问题如何解决
    这篇文章主要介绍“Spring JPA增加字段执行异常问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring JPA增加字段执行异常问题如何解决”文章能帮助大家解...
    99+
    2023-07-02
  • 如何解决服务器响应过慢的问题
    解决服务器响应过慢的方法:1、使用服务器的Gzip压缩功能,对网站程序的代码以及图片大小进行简化压缩,从而减少网站程序整体大小提高网站速度;2、使用服务器搭建网站程序时,需要减少http请求数,从而提高网站响应速度;3、给服务器配置进行升级...
    99+
    2024-04-02
  • 解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题
    Spring JPA 使用@transaction注解时产生CGLIB代理冲突 在使用JPA进行数据库的删除操作时需要使用@Transactional注解来支持事物: @Mod...
    99+
    2024-04-02
  • 解决VMware内存占用过高问题
    回顾多年的记录笔记方法,… 一、故障现象、 VMware虚拟机使用时间一段时间后,会出现开启VMware客户机内存占用过高问题。 二、故障分析 VMware cache缓存区目录占用太大空间。 2、由...
    99+
    2023-09-01
    ubuntu 服务器 运维
  • 解决python存数据库速度太慢的问题
    问题 在项目中遇到一个问题,需要从文本中读取三万条数据写入mysql数据库,文件中为用@分割的sql语句,但是在读取的过程中发现速度过慢,三万八千条数据需要220秒,问题代码片段如下...
    99+
    2024-04-02
  • 解决rocketmq-client日志保存路径的问题
    rocketmq-client日志保存路径 由于使用rocketmq-client会生成一个rocketmq_client.log日志文件,一般默认存于系统盘内,且持续增长速度较快,...
    99+
    2024-04-02
  • C#路径问题中的如何保存问题的解决方法
    本篇内容主要讲解“C#路径问题中的如何保存问题的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#路径问题中的如何保存问题的解决方法”吧!C#路径问题之保存路径的提问我在项目里建立了一个...
    99+
    2023-06-18
  • Spring Cloud Gateway内存溢出问题如何解决
    本篇内容主要讲解“Spring Cloud Gateway内存溢出问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Gateway内存溢出问题如何解决”吧!记 ...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作