数十万条以上的大量数据如何快速插入数据库中

2023-11-06

引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了30秒,前面计算也耗费了二十多秒,系统流畅度因此很难堪。经过我的排查发现主要是两个点需要优化。

1)计算的算法冗余,优化前23秒计算完成,优化后0.8秒完成计算(由于业务特殊、保密不方便透露)

2)十五万条数据批量插入数据库时耗费了30秒,优化后3秒。(已达到业务要求范围内,所以不再继续其他细节优化)

批量插入基于的是mybatisplus 的service的insertBatch方法

优化思路:

使用线程池+任务分派器将15万条数据平均分派给线程池中16个线程去处理

存储所有数据的集合为list

线程池使用的FixedThreadPool,因为机器是四核8线程,所以我线程池里放的16个线程。

1、创建线程池

ExecutorService es = Executors.newFixedThreadPool(16);

2、任务分派器

其实就是一个函数,负责分派要插入的数据集合,遍历0到(线程数-1),然后将集合中所有数据平均分配到每一个线程(数据数量%线程数=余数,余下的几个数据的插入工作直接分配给最后一个线程去)

经过分配后每个线程负责1万条数据的插入

16个线程同时跑,由原来的30秒跑完,变成了3秒钟。

如果还需要优化,可以在线程内将自己受到的1万条数据,分10次批量插入或者每1000条批量插入一次

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数十万条以上的大量数据如何快速插入数据库中 的相关文章

  • 更改 MySQL Workbench 上的默认字符集

    我正在尝试使用连接到我的 MYSQL 数据库utf8mb4字符集 请注意 数据库字符集的全局设置已经是 utf8mb4 我可以使用 CLI 轻松完成此操作 如下所示 mysql h myhostname u myuser p default
  • 为什么从 Eclipse 导出的可运行 JAR 不起作用?

    我有一个在 Eclipse 中运行良好的项目 但是 当我将其导出到可运行的 JAR 其中包含依赖项 时 它不会运行 从控制台运行 JAR 时出现的错误是 编辑 之前没有使用 jar 运行它 INFO Loading XML bean def
  • Powermockito 可以在非最终具体类中模拟最终方法吗?

    假设我有一个非最终具体类 具有如下所示的最终方法 public class ABC public final String myMethod return test test 可以嘲笑吗myMethod 调用时返回其他内容junit usi
  • jUnit 中每个 @Test 的不同拆卸

    有没有办法为 jUnit 中的每个 Test 定义不同的拆卸 Use the After注释来指示每个之后要运行的方法 Test 像这样的全套注释是 BeforeClass 首先 Tests are run Before 在每个之前 Tes
  • 复制具有不同列名的 MySQL 表

    我需要将 table1 中与特定列匹配的所有行复制到具有不同列名称的 table2 中 例如 table1 name oldAddressBook table1 的列 name Name Surname Number table2 name
  • 使用Keycloak保护Tomcat应用程序时出现HTTP 403禁止错误

    我为这个错误苦苦挣扎了一整天 我一遍又一遍地检查我在tomcat中Keycloak和APP的配置 没有发现错误 下图为测试场景 APP配置 1 Keycloak json是从Keycloak控制台复制的 2 context xml 也正确
  • 从 java.util.TimeZone 转换为 org.joda.DateTimeZone

    在Java中如何将一个实例转换为java util TimeZone to org joda DateTimeZone并保持夏令时 Joda Time 处于维护模式 The 乔达时间 http www joda org joda time
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa
  • Java GUI,根据actionListener更改面板

    我在两个不同的面板中添加了两个按钮 如果单击第一个按钮 则需要转到下一个面板 其中包含第二个按钮 但是当我单击第一个按钮时 该按钮没有被替换 Java GUI import java awt event ActionEvent import
  • Mac OSX 上使用 Java 7 的透明 JFrame/JWindow

    我们有一个屏幕共享小程序 它打开 Swing JFrame 并使用 Robot 类捕获空框架后面的屏幕 用户可以单击框架并与小程序后面的任何内容进行交互 这在 Windows 上运行良好 并且用于 Apple 的 Java 版本 但对于 M
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • 查找前 N 个五边形数

    我必须找到第一个N pentagonal numbers 1 从 1 100 并每行显示 10 个 我必须使用getPentagonalNumber int n 方法也是如此 显然这就是它存在的原因 到目前为止 这是我的代码 package
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • 在 Scala 中创建 Java 对象

    我有一个 Java 类 Listings 我在 Java MapReduce 作业中使用它 如下所示 public void map Object key Text value Context context throws IOExcept
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • 如何列出所有已加载的 Spring bean 定义文件

    在大型企业系统中 并不总是清楚在 ApplicationContext 构建期间导入了哪些文件 有没有办法列出过程中加载的所有文件 我知道如何列出加载的属性文件 但不知道导入的 bean 文件 更新示例 文件 1 applicationCo
  • 当列表中不存在 X 时,从列表中查找大于 X 的值

    我试图从列表中查找大于特定值 在我的情况下已知 的值 Example Given list 1 2 5 10 15 list is sorted 查找大于的值X 7在这种情况下 期望的结果 返回一个包含值的列表 10 15 我尝试使用jav
  • 尝试 Catch 性能 Java

    当捕获异常而不是进行检查时 try catch 需要多长时间 以纳秒为单位 假设消息具有用于查找的 HashMap 类型性能 try timestamp message getLongField MessageField TIMESTAMP
  • 选择具有按两列分组的最大值的行

    我见过很多关于此类问题的解决方案 尤其是这个SQL 仅选择列上具有最大值的行 https stackoverflow com questions 7745609 sql select only rows with max value on

随机推荐

  • Centos 8二进制安装Mysql-8.0.23

    1 mysql tar包的下载 下载官网 https downloads mysql com archives community 2 解压 root cent8 yzil tar xf mysql 8 0 23 linux glibc2
  • 基于NB-IoT物联网智能运维箱整体解决方案

    一 方案背景 雪亮工程 智慧交通 水利监控 环保监控等系统大多安装于户外 设备量级大 分布广 易受到恶劣环境和人为破坏等因素影响 导致系统故障率高 可用性差 传统人工维保存在维护成本高 效率低的问题 难以保证设备的高在线率 在物联网 边缘计
  • 代码行数统计小工具

    一 先下载好SourceCounter小工具 解压 然后直接打开文件夹中的SourceCounter exe 如果没有找到此工具的下载链接 点这里下载 二 选择代码类型 勾选上所有类型 三 双击点开后 选择文件夹 就可以直接统计出字数了
  • 前端笔记(4)JavaScript宏观与微观任务

    宏观和微观任务 在 ES3 和更早的版本中 JavaScript 本身还没有异步执行代码的能力 这也就意味着 宿主环境传递给 JavaScript 引擎一段代码 引擎就把代码直接顺次执行了 这个任务也就是宿主发起的任务 但是 在 ES5 之
  • 顺序表的基本操作(C语言实现)

    顺序表 前言 本文主要讲线性表的其中一种 那就是顺序表 顺序表就是采用顺序储存方式来存储数据 所谓顺序存储 就是数据在内存上的地址同样为连续储存 中间不允许有空 有间隔 顺序表的优点在于支持随机访问 就是通过下标来访问元素 缺点是插入 删除
  • iBatis resultMap报错 nullValue完美解决

    错误信息 SQLErrorCodesFactory Database product name cached for DataSource org apache commons dbcp BasicDataSource 19c5048 na
  • OSWatcher.sh脚本说明

    OSWatcher sh脚本位于oswbb目录下 Oracle 19c数据库中脚本的路径是 u01 app oracle product 19 0 0 dbhome 1 suptools tfa release tfa home ext o
  • Maven中dependencyManagement作用说明

    备注 今天有好些实习的同事问到Maven中关于dependencyManagement和普通dependencies的区别 说多了 麻烦 记录一下 在Maven多模块的时候 管理依赖关系是非常重要的 各种依赖包冲突 查询问题起来非常复杂 于
  • python网络爬虫有那些实例_python爬虫经典例子有哪些

    python爬虫例子 首先导入爬虫的库 生成一个response对象 然后设置编码格式 并打印状态码 最后输出爬取的信息 代码为 print response text python爬虫例子 1 爬取强大的BD页面 打印页面信息 第一个爬虫
  • 毕业设计-基于机器视觉的焊缝图像处理研究- OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 焊缝识别系统设计 二 焊缝图像预处理 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要
  • 设置读取plc时间_Visual Studio 2010-C#跟西门子1200(Sharp7)窗体控制④-循环读取

    Visual Studio 2010 C 跟西门子1200 Sharp7 窗体控制 循环读取 上期回顾 上期主要是对单个按钮 按下后能够同时置位PLC的多个位 本期做一个读取PLC的OK NOK的统计数据的C 标签 先创建一个标签 在设定一
  • SpringBoot:@Schedule定时任务

    一 Schedule SpringBoot内置了Sping Schedule定时框架 通过注解驱动方式添加所注解方法到定时任务 根据配置定时信息定时执行 二 定时任务实现 1 开启定时任务 package com gupao springb
  • 使用VBA在工作表中快速插入行

    在工作表中插入行 有需要用到代码吗 是不是杀鸡用牛刀的感觉 其实不是这样的 在很多复杂的应用场景中 插入行不再是简单的单击鼠标右键就可以即刻完成的 比如需要隔行插入空行 如果有一万行数据 是不是搞到手抽筋了 再比如插入空行的数量不是固定的
  • 自动记录数据录入时间不懂得VBA的朋友可以看看

    在日常工作中 经常会遇到需要实时记录数据录入的时间问题 有朋友会说了 用快捷键啊 按Ctrl 分号 可以返回当前的系统日期 按Ctrl Shift 分号 可以返回当前的系统时间 但是如果需要同时返回日期和时间又该怎么处理呢 对于懂得VBA的
  • 关于对Vue中slot插槽理解

    关于slot插槽理解 1 何时需要使用插槽 在开发中 我们需要将共性内容抽取到组件中 将不同的暴露为插槽 插槽的益处便是 一旦预留了插槽 使用者便可以根据自己的需求来决定插槽中插入的的内容 2 slot的基本使用 div div
  • 软件测试之网络协议基础

    软件测试之网络协议基础 前言 我会在此账号上持续更新 软件测试的文章 包括网络部分 前端代码部分 数据库部分 软件测试部分 互联网协议 osi 7层协议 tcp ip 5层协议 网络协议的存在是为了两者中间根据一定的协议沟通交流 每层运行常
  • 光线跟踪(RayTracing)原理及c++实现

    Chapt1 Why to write a RayTracing Render 提到Computer Graphics 众所周知的是如OpenGL Direct3D这样非常流行的光栅化渲染器 事实上 这些大部分应用于游戏制作的API主要为实
  • Flutter控件——布局控件:层叠

    Stack 层叠布局 Android 中的 Frame 布局是相似的 子组件可以根据距父容器四个角的位置来确定自身的位置 层叠布局允许子组件按照代码中声明的顺序堆叠起来 Flutter中使用Stack和Positioned这两个组件来配合实
  • 怎么关闭win10虚拟机服务器,win10系统彻底关闭退出vmware虚拟机的步骤

    有关win10系统彻底关闭退出vmware虚拟机的操作方法想必大家有所耳闻 但是能够对win10系统彻底关闭退出vmware虚拟机进行实际操作的人却不多 其实解决win10系统彻底关闭退出vmware虚拟机的问题也不是难事 小编这里提示两点
  • 数十万条以上的大量数据如何快速插入数据库中

    引言 这几天工作这边同事遇到了一个问题 对十五万条数据进行计算 插入数据库的时候耗时很严重 使用了批量插入对十五万条数据插入仍然耗费了30秒 前面计算也耗费了二十多秒 系统流畅度因此很难堪 经过我的排查发现主要是两个点需要优化 1 计算的算