教你如何将二进制文件导入到数据库

3A网络
• 阅读 337

教你如何将二进制文件导入到数据库

1.1 现网业务场景

源数据推送二进制流 --> 解析二进制 --> 解析后的数据导入数据库

为了模拟生产的业务场景,客户提供了一个二进制文件及二进制文件的解析程序,需要我们解析二进制文件后导入数据库。

1.2 测试方案

由于客户给出的解析程序是单条解析,为了提升数据导入的性能,需要微批导入的方式,在内存中积攒一定量的数据后,再调用 copymanager 接口导入数据库中。最终测试方案的整体流程如下所示:

教你如何将二进制文件导入到数据库

1.3 测试过程

从上图可以看出,一批数据的耗时由三部分组成:

  • 解析二进制文件
  • 积攒一批数据
  • 数据导入数据库

\1) 解析二进制文件

这是客户提供的 Java 程序,按行读取二进制文件中的数据,每行解析成一个 String 对象。

\2) 积攒数据

积攒的数据最终是要通过 copymanager 接口导入数据库中的,因此其对象类型需要是 copymanager 接口可以调用的。从下图中可以看出,其对象类型为 InputSream。

教你如何将二进制文件导入到数据库

初步采用的解决方案是将解析后的 String 对象拼接起来,然后在 copymanager 接口中将 String 转为 InputStream。在测试过程中发现,由于 String 类型在处理这种大对象的时候效率较低随着积攒数据的增多,这部分耗时越来越久,因此,最终方案是将解析后的数据存放到 StringBuffer 对象中。

\3) 调用 copymanager 接口

在 Java 中引用 GaussDB(DWS)安装包中的 JDBC 驱动后,需要 import CopyManager 及 BaseConnection

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

在创建 copymanager 对象的时候,需要将 Connection 对象转为 BaseConnection,如下所示:

CopyManager copyManager = new CopyManager((BaseConnection)conn);

1.4 测试结果

在单连接的情况下,解析 + 入库可处理 10.1W/S,导入性能可达到 64.5W/S;

在 255 并发情况下,解析 + 入库可处理 1252.1 W/S,导入性能可达到 4132.4W/S。

1.5 总结

  • 在本地执行测试代码(以上的环境博主都是部署在cnaaa云服务器上的,感兴趣的朋友也可以自己部署一套尝试下)

在本地用 idle 调试中需要一个二进制文件,可以从客户给出的文件中执行 head –n 1000 ***.dat>1.dat 截取一部分文件内容放在本地。

  • 各个时间收集

为了更好的给客户展现我们数据库的强大性能,需要把数据库导入的时间单独列出来,给客户一个更加直观的感受。

  • 高并发的设计

首先,将并发程序布置在集群外的服务器上, 然后为了避免单盘 IO 性能瓶颈,在每块盘上存放一份数据文件及解析程序。由于是把一批数据积攒到内存中的,因此在启动并发时需要注意内存的使用情况。

在客户端服务器并发 75、内存已经饱和的情况下,查看集群的 cpu 及内存使用率仍然不高,因此,在集群内部的所有节点上每个增加 30 并发,达到最大并发数。

注意事项:

  • JDBC 连接时,把所有并发平均分配到各个 CN 节点上;
  • 集群内部节点 JDBC 连接时可能会报 gss 错误,需要修改 conf 配置文件,将本地 ip 的连接方式由 gss 改为 sha256。
点赞
收藏
评论区
推荐文章
文件操作
文件原理解析C文件概述程序执行时称为进程,进程运行过程中的数据均在内存中。需要存储运算后的数据时,需要使用文件。这样程序下次启动后,就可以直接从文件中读取数据。(之前的程序每次运行都需要手动输入数据)。文件是指存储在外部介质(如磁盘、磁带)上的数据集合。操
Wesley13 Wesley13
2年前
mysql数据库设计规范
一、数据库设计规范1.使用innodb引擎2.数据库和表的字符集统一使用utf83.所有表和字段添加注释4.单表数据量控制<500w5.谨慎使用mysql分区,跨区查询影响性能6.冷热数据分离,缓存7.禁止在数据库中存储图片,文件等大的二进制数据8.禁止在线上做数据库压力测试9.禁止从开发和测试环境直接连
Wesley13 Wesley13
2年前
MySQL日志管理工具 mysqlbinlog
使用mysqlbinlog查看二进制日志文件 mysqlbinloghelp帮助文档常用选项:\d,databasename指定数据库名称,只列出指定的数据库相关操作\o,offsetnumber忽略掉日志中的前number行
Easter79 Easter79
2年前
TiDB Ecosystem Tools 原理解读系列(三)TiDB
作者:张学程简介TiDBDM(DataMigration)是用于将数据从MySQL/MariaDB迁移到TiDB的工具。该工具既支持以全量备份文件的方式将MySQL/MariaDB的数据导入到TiDB,也支持通过解析执行MySQL/MariaDBbinlog的方式将数据增量同步到TiDB。特别地,对于有多个MySQL
Wesley13 Wesley13
2年前
MySQL Binlog 技术原理和业务应用案例分析
导语MySQLBinlog用于记录用户对数据库操作的结构化查询语言(StructuredQueryLanguage,SQL)语句信息。是MySQL数据库的二进制日志,可以使用mysqlbin命令查看二进制日志的内容。爱奇艺在会员订单系统使用到了MySQLBinlog,用来实现订单事件驱动。在使用Binlog后在简化系统设计的同
Stella981 Stella981
2年前
PostgreSQL 数据库备份与恢复 pd_dump pg_restore
备份PG数据库生成的文件可以有两种,一种是SQL文件,一种是二进制文件,二进制文件只能使用pg\_restore进行恢复。PostgreSQL数据库操作简要说明PostgreSQL数据库版本psqlversionpsql(PostgreSQL)9.1.3下面是在linux下的操作,在windows下面将sup
Stella981 Stella981
2年前
Charles解析protobuf之初探
前言在程序开发以及网络通信传输过程中最常见的数据格式就是JSON、XML,或者是一种压缩效率更高的数据格式——Google的ProtoBuf。ProtoBuf在传输过程中是以二进制的格式传输的,测试抓包的时候如果需要查看请求或返回消息中携带的参数信息就需要对它进行解析。小编之前在Windows环境下使用公司童鞋开发的Fiddler插件可以完成解析
Stella981 Stella981
2年前
Jvm类的加载机制
1.概述虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制。2.类的加载时机类从被虚拟机加载到内存开始,直到卸载出内存为止,整个生命周期包括:加载——验证——准备——解析——初始化——使用——卸载这7个阶段。其中验
Stella981 Stella981
2年前
Spingboot项目实现登陆(H2DB和图片验证码)+上传文件+解析EXCEL
    近期手头有个需要重构的小项目,于是就想用Springboot来完成,所以就周末在家先初步搭好,功能很简单,实现密码和图片验证码双重验证以及解析excel获取数据,一开始是使用dockermysql的,后来经理建议换成h2,所以就改了下数据库,然后上传excel文件并解析其中数据,解析后数据的操作使用就是公司业务问题就不便在此多说了。接下来一步步操作
京东云开发者 京东云开发者
9个月前
【ChatGPT应用篇】助力Beauty代码的初体验 | 京东云技术团队
思考过程:案例1:项目里面有Excel文件的解析场景,试着与ChatGPT进行了交互,现将问题整理如下:1.给我写一个Java版本的excel导入解析代码(毫不客气的分配任务)2.需要支持100000000数据量(业务需求变更)3.优化代码需要支持1000