教你如何将二进制文件导入到数据库
摘要:使用copymanager接口,读取二进制文件流,将二进制文件中的数据导入到数据库中。
本文分享自华为云社区《从二进制文件导入到GaussDB(DWS)》,作者:你怎么这么好看。
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 总结
- 在本地执行测试代码
在本地用idle调试中需要一个二进制文件,可以从客户给出的文件中执行head –n 1000 ***.dat>1.dat 截取一部分文件内容放在本地。
- 各个时间收集
为了更好的给客户展现我们数据库的强大性能,需要把数据库导入的时间单独列出来,给客户一个更加直观的感受。
- 高并发的设计
首先,将并发程序布置在集群外的服务器上, 然后为了避免单盘IO性能瓶颈,在每块盘上存放一份数据文件及解析程序。由于是把一批数据积攒到内存中的,因此在启动并发时需要注意内存的使用情况。
在客户端服务器并发75、内存已经饱和的情况下,查看集群的cpu及内存使用率仍然不高,因此,在集群内部的所有节点上每个增加30并发,达到最大并发数。
注意事项:
- JDBC连接时,把所有并发平均分配到各个CN节点上;
- 集群内部节点JDBC连接时可能会报gss错误,需要修改conf配置文件,将本地ip的连接方式由gss改为sha256。
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~
原文地址:https://www.cnblogs.com/huaweiyun/p/15060807.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义View倒计时圆
- Android开发实现的IntentUtil跳转多功能工具类
- Android端“被挤下线”功能的单点登录实现
- Android轻松实现多语言的方法示例
- Android开发实现去除bitmap无用白色边框的方法示例
- Android开发实现的内存管理工具类
- Android日期和时间选择器实现代码
- Android开发实现ImageView加载摄像头拍摄的大图功能
- Android开发实现的Intent跳转工具类实例
- Android开发中的文件操作工具类FileUtil完整实例
- Android开发中超好用的正则表达式工具类RegexUtil完整实例
- Android ijkplayer的使用方法解析
- Android开发实现查询远程服务器的工具类QueryUtils完整实例
- 解决android studio 3.0 加载项目过慢问题–maven仓库选择
- Android实现朋友圈点赞列表