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

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

时间:2022-09-22 14:34:41浏览次数:114  
标签:导入到 文件 copymanager 二进制 数据库 导入 解析

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

1.1 现网业务场景

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

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

1.2 测试方案

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

img

1.3 测试过程

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

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

\1) 解析二进制文件

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

\2) 积攒数据

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

img

初步采用的解决方案是将解析后的 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。

标签:导入到,文件,copymanager,二进制,数据库,导入,解析
From: https://www.cnblogs.com/htx666/p/16719148.html

相关文章

  • 如何使用 JavaScript 解决二进制间隙
    如何使用JavaScript解决二进制间隙在编码训练营4个月后,我决定开始做数据结构和算法问题,为我的技术面试做准备。我使用的一些网站是:可编码性黑客等级有什么比......
  • 有符号二进制txt导入matlab
    clc;clear;a=textread('E:/output.txt','%s');%输入txt文件m=N;%Nbitsn=length(a);%需要转换的数字个数Qin0=zeros(n,1);fori=1:nQin0(i)=bin2......
  • python生成sql server 数据库表名和sql脚本
    #-*-coding:utf-8-*-#作者:TY#时间:2020-08-0522:03#文件名称:sqlserver数据库导表脚本.PY#开发工具:PyCharmimportpymssqlimportosclassSQLServer:......
  • linux下手动删除数据库实例
      关闭所有oracle进程因为准备要删除数据库,所以不用正常完成数据的保存shutdownabort如果没有设置开机自动启动,服务器也没有运行其它系统,可以考虑重启服务......
  • MYSQL备份(直接拷贝数据库文件
    目的:把A机中的库转移到B机中。1、停止mysql服务,在A机mysql安装目录下,找到my.ini文件打开,在此文件中找到datadir,把这个路径下的数据文件:ibdata1以及所有文件夹拷贝到B机中d......
  • MySQL数据库不能远程访问的解决办法
    MySQL数据库不允许从远程访问怎么办?本文提供了三种解决方法:1、改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mys......
  • 数据库
    SQL (StructuredQueryLanguage) :结构化查询语言;sql的特点:1.综合同一;2.高度非过程化;3.面向集合的操作方式;4.一种语法提供多使用方式;5.语言简洁,易学易用‘sql......
  • 面试官:为什么数据库连接很消耗资源?
    开发应用程序久了,总想刨根问底,尤其对一些有公共答案的问题。大家都能解释,但是追根究底,都解释不清。凡是都有为什么,而且用数字说明问题是最直观的。本文主要想探究一下连接......
  • Node.js 的学习(四)分别连接MongoDB与MySQL数据库,实现增删查改功能
    一、Node.js访问MongoDB数据库MongoDB对许多平台都提供驱动可以访问数据库,如C#、Java、Node.js等。1.1、安装MongoDB访问驱动命令如下:全局安装驱动:npminstallmon......
  • cmd导入导出Oracle数据库命令
    导入与导出,如下:数据导出:exp用户名/密码@网络服务名file=xxx.dmptables=(表名);eg:expuser/[email protected]=d:\dbbackup\file1221_zwy.dmplog=d:\dbbac......