百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

【实战】批量插入数据,如何优化?

sinye56 2024-10-04 23:42 4 浏览 0 评论

今天我们从实战出发,来看一看批量插入数据应该如何优化?

需求背景

公司有一个资金平台系统,对内承接集团内所有子公司的交易指令,对外与各个银行交互,发送交易指令。

该平台之前与各子公司交互采用的是oracle的dblink方式,100W的交易数据基本上几分钟就同步过来了。

但是随着公司全面推进信创,oracle数据库需要用国产数据库进行替代,那随之面临的问题是,该平台与集团内各子公司的交互方式应该换成什么?我们需要对该平台与各子公司的交互方式重新进行设计。

需求要求

集团内各子公司数据推送的特点可以简化为每隔1 个小时,会有 300 万条交易指令数据的推送。与子公司交互方式的设计方案需要满足如下要求:

1、需要快速的接收大量的数据,不能造成交易等待。

2、需要确保字段完整、无篡改.

3、不能出现重复交易,即历史已存在相同的交易数据时,新数据不能落库。

4、单条数据接收异常,不能影响其他数据的接收。

交互方案

经过深思熟虑,决定引入中间件 RocketMQ作为资金平台与集团各子公司间交互的中间件。即集团各子公司将交易指令推送到MQ中,资金平台消费MQ中的交易指令。

交互方案POC 验证

选择一家子公司进行交互方案POC验证,验证步骤如下:

1、子公司发送800万条数据到MQ队列,交易平台进行消费,一个MQ消息内包含100条交易指令数据。

2、交易平台消费逻辑为:获取数据->非空校验->防重校验->单条数据部分字段落表 A->单条数据部分字段落表 B->发送交易指令接收结果到 MQ 队列。

验证的环境如下:

  • 数据库为oracle 数据库。
  • 应用使用druid数据库连接池,初始链接数设置为10,最大链接数设置为20。
  • 使用@Transactional进行事务控制,防止落表A成功,落表B失败。
  • 应用单实例消费。

验证结果:

落表228710条数据,耗时4672秒,平均每秒落表48.95条数据。这个速度显然是不行的,按这个速度,单实例消费 300万条数据需要17个小时左右。

我们要想想有什么可以优化的方法?

方法一:

@Transactional事务会影响数据库插入的性能,落A表成功,落B表失败属于小概率事件。我们可以去掉@Transactional事务,利用在落B表失败时手动捕获异常,然后根据关联的主键删除A表数据的方式来手动实现事务。

方法一验证结果:

落表 379933 条数据,耗时6300 秒,平均每秒落表 60.31 条数据。数据插入表的速度有明显提升,因此去掉事务这个方法有效,可以提升插入数据的速度。

方法二:

我们这个场景是快速消费数据的场景,需要频繁和数据库交互。而我们使用了数据库连接池,这个时候数据库连接池的数量就是一个很关键的配置。应用使用druid 数据库连接池,初始链接数设置为 10,最大链接数设置为 20,我们适当调大数据库链接池的数量,将初始链接数设置为30,最大链接数设置为80,再试试。

方法二验证结果:

落表854521 条数据,耗时14871秒,平均每秒落表 57.46 条数据。方法二是在方法一的基础上改动的,因此结果应该与方法一的结果进行对比。对比方法一、二,发现调大连接池数量并不能直接提升插入速度,反而还会降低

数据库连接池的数据并非调的越大越好,应该根据具体的业务场景,压测出一个最优的数据库连接池数量的配置。

方法三:

我们先把数据库连接池的数量调回初始链接数设置为10,最大链接数设置为 20。每个 MQ 消息包含100 条交易指令,而我们进行单条数据插入的原因是为了避免单条数据插入失败对其他数据的影响。

其实仔细想一想,插入失败的场景毕竟是少数,我们可以采用批量插入。而当批量插入异常时,再将失败的整批再次单条插入来隔离单条异常。用这个方法再试试。

方法三验证结果:

落表621300条数据,耗时9029秒。平均每秒落表68.81条数据。相比方法一,每秒多落了8条数据。说明单笔插入改为批量插入方法有效,可以提升插入数据的速度。

总结

本期我们从实战出发,根据项目的实际情况介绍了三种批量插入数据的优化方法,优化的效果我们也做了验证。

实际在我们的开发过程中,当系统出现性能瓶颈时,要综合考虑业务场景的特性去做优化

方案(当然只有见的优化方案多了,那时候才能想的到),同时也要针对业务场景去做优化方案验证。毕竟程序设计没有银弹。

同样的优化方案在不同的业务场景下得到效果可能完全不同。比如增加数据库连接数,在我们文中的例子中优化效果不好,但是在我们另外一个高并发业务场景中,连接数从30调到80,每秒能增加20条数据的插入。当然程序设计是一个权衡得失的过程,增加单实例的数据库连接数必然带来的是,可扩展的总实例数的下降。因为数据库的最大连接数是固定的,所有实例的数据库连接相加必然得小于数据库的最大连接数。

最后回到这个实战上,经过3个方案的优化,单实例消费300W数据仍然需要12小时的时间,如何满足1小时消费300W数据呢?

  1. 继续根据业务场景优化批量插入数据的效率。
  2. 增加消费实例数。


相关推荐

linux安装FTP

1、在nkftp目录下安装ftp,进入到nkftp里面[root@localhostbin]#cd/data/nkftp执行安装命令:[root@localhostnkftp]#rpm-i...

LINUX下搭建FTP服务器

FTP服务器介绍FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(App...

Linux下如何进行FTP设置

目录:一、Redhat/CentOS安装vsftp软件二、Ubuntu/Debian安装vsftp软件一、Redhat/CentOS安装vsftp软件1.更新yum源yumupdate-y2.安...

推荐使用集串口 SSH远程登录和FTP传输三合一工具MobaXterm

来源:百问网作者:韦东山本文字数:1216,阅读时长:4分钟在以前的资料里,串口和SSH远程登使用SecureCRT,window与ubuntu数据传输使用filezilla,窗口切换来切换去,麻烦也...

如何搭建FTP服务器(Linux系统)

上次说了Windows操作系统下搭建的FTP服务器,那有朋友问我,说买的XX轻量应用服务器都是属于Linux的操作系统,我该如何为搭建FTP服务器呢?...

Linux 命令 ncftp(文件传输)——想玩转linux就请一直看下去

我是IT悟道,点击右上方“关注”,每天分享IT、科技、数码方面的干货。Linuxncftp命令...

如何用 ftp 实现一键上传

简介ftp是Internet标准文件传输协议的用户界面,它允许用户与远程网络站点之间传输文件...

Linux安装ftp

1安装vsftpd组件安装完后,有/etc/vsftpd/vsftpd.conf文件,是vsftp的配置文件。[root@bogon~]#yum-yinstallvsftpd2添加一个...

一天一点点:linux - ftp命令

linuxftp命令设置文件系统相关功能。FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身。语法ftp[-dignv][主机名称或IP地址]参数:-d详细显示指令执...

Centos 7 搭建FTP

目录安装软件以及启动服务添加防火墙规则关闭selinuxftp配置常用常用参数详解特殊参数配置文件没有的参数也可以添加到配置中1.安装软件以及启动服务yuminstall-yvsftpdsys...

【Linux】Linux中ftp命令,没有你想的那么简单

本文介绍了Linux中FTP命令的基本用法,包括连接与登录远程服务器,以及解析了FTP协议中五个最常用的操作命令的使用和解析过程。同时,提供了一个包含常用FTP操作命令的表格,供读者参考。通过熟练掌握...

linux 命令行操作ftp

以下是linuxftp命令参数的详解。FTP>!从ftp子系统退出到外壳?FTP>?显示ftp命令说明??和help相同?格式:?[command]说明:[com...

多学习才能多赚钱之:linux如何使用ftp

linux如何使用ftp步骤1:建立FTP连接想要连接FTP服务器,在命令上中先输入ftp然后空格跟上FTP服务器的域名'domain.com'或者IP地址例如:ftpdom...

linux常用网络操作方法:ftp命令使用方法

常用网络操作方法Linux提供了一组强有力的网络命令来为用户服务,这些工具能够帮助用户登录到远程计算机上、传输文件和执行远程命令等。本节介绍下列几个常用的有关网络操作的命令:ftp传输文件tel...

Linux 5.15有望合并Memory Folios方案 内核构建速度可提升7%

甲骨文公司的长期内核开发人员MatthewWilcox已经研究了“内存对开区”概念相当长的一段时间,这可以改善Linux的内存管理,使其具有更大的效率。例如,使用内存对开的基准测试表明,内核的构建速...

取消回复欢迎 发表评论: