mysql写入数据库1s中_在程序中通过ADB Client高效写入数据_weixin_39673293的博客-程序员宅基地

技术标签: mysql写入数据库1s中  

背景信息

ADB Client旨在为用户提供一个高效、简单地插入数据到分析型数据库MySQL版的方法。您只需要通过接口将数据提交给ADB Client,便可以直接插入数据到分析型数据库MySQL版中。使用ADB Client时,您无需关心分区聚合、连接池等问题,而且对数据实时写入也有更多的自主能力,不再强依赖DataHub等服务。

61e25095265f167f0e39ad7f38e25f4b.png

Maven repositories

通过Maven管理配置新的SDK版本,Maven的配置信息如下:

com.alibaba.cloud.analyticdb

adbclient

1.0.2

接口列表

DatabaseConfig类接口名 描述

setHost(String adbHost) 设置需要连接的分析型数据库MySQL版主机/域名。

setPort(int port) 设置需要连接的分析型数据库MySQL版端口。

setDatabase(String database) 需要连接的分析型数据库MySQL版库名。

setUser(String username) 设置连接分析型数据库MySQL版使用的用户名,请填AccessKeyId。

如何获取AccessKeyId,请参见账号与权限管理。

setPassword(String pwd) 设置连接分析型数据库MySQL版使用的密码,请填AccessKeySecret。

setTable(List table) 需要写入的表名List,建议小写。

setColumns(String tableName, List columnList) 需要插入表的字段名,若是全字段插入,则使用columnList.add("*")即可。

table列表中的所有表都需要设置小写的字段名,否则无法通过检查。

setIngnoreInsertError(boolean isIngnoreInsertError) 针对配置的所有表,设置是否忽略插入时遇到的error,默认为false。

setInsertIgnore(boolean insertIgnore) 针对配置的所有表,请根据业务场景判断是否使用insert ignore into语句。

setEmptyAsNull(boolean emptyAsNull) 针对配置的所有表,将empty数据设置为null,默认为true。

setParallelNumber(int parallelNumber) 针对配置的所有表,设置写入分析型数据库MySQL版时的并发线程数,默认为4。

setLogger(Logger logger) 设置client中使用的logger对象,此处使用slf4j.Logger。

setRetryTimes(int retryTimes) 设置提交时写入分析型数据库MySQL版出现异常时重试的次数,默认为0。

setRetryIntervalTime(long retryIntervalTime) 设置重试间隔的时间,单位是ms,默认为0。

setCommitSize(long commitSize) 设置自动提交的SQL长度(单位Byte),默认为32KB,一般不建议设置。

setInsertWithColumnName(boolean insertWithColumnName) 设置在拼接insert SQL时,是否需要带字段名,默认为true,即:

insert into tableName (col1,col2) values ('value1','value2');

如果为false,语句则类似insert into tableName values ('value1','value2');,此种情况下如果在表中加字段可能会导致写入失败。此设置只有在column列设置为“*”的情况下才会生效。

Row类接口名 描述

setColumn(int index, Object value) 设置Row字段列表的值,必须确认字段的顺序。

此种方式下,Row实例不可复用,每条数据必须使用单独的Row实例。

setColumnValues(List values) 直接将List格式数据行写入Row中。

updateColumn(int index, Object value) 更新Row字段列表的值。

此方法中,Row实例可以复用,只需更新Row实例中的数据即可。

AdbClient类接口名 描述

addRow(String tableName, Row row) / addRows(String tableName, List rows) 插入对应表的Row格式化的数据,即一条记录。数据会按照分区聚合的形式在SDK的内存中缓存,等待提交。

如果SQL长度已满,则会在addRow或者addMap的时候做一次自动提交,然后将最新的数据新增进来。

如果在自动提交时失败,调用方需要处理异常,并且会在异常中得到失败的数据列表。

addMap(String tableName, Map dataMap) / addMaps(String tableName, List> dataMaps) 对应于addRow,支持map格式数据的写入。

如果SQL长度已满,则会在addRow或者addMap时做一次自动提交,然后将最新的数据新增进来。

如果在自动c提交时失败,调用方需要处理此异常,并且会在异常中得到失败的数据列表。

addStrictMap(String table, Map dataMap) / addStrictMaps(String tableName, List> dataMaps) 作用和addMap/addMaps类似,不同之处是传入的Map数据的key必须是表的字段。如果不是,会重新获取一次表结构信息,如果还没有改key的字段,则直接报错。

其他功能与addMap/addMaps一致。

如果没有动态表结构变更,不建议使用改接口,性能会有所损耗。

commit() 将缓存的数据进行提交,写入分析型数据库MySQL版中。若提交失败,会把执行错误的语句放在异常中抛出,调用方需要对此异常进行处理。

TableInfo getTableInfo(String tableName) 获取对应表的结构信息。

List getColumnInfo(String tableName) 获取对应表的字段列表信息,字段类是ColumnInfo,可以通过columnInfo.isNullable()获取该字段是否能为null。

Connection getConnection() throws SQLException 从客户端连接池获取mysql Connection连接,调用方可以使用获得的Connection做非插入操作,使用方式和jdbc的连接使用方式一致。

注意:使用结束后需要释放掉相应的资源(如ResultSet、Statement、Connection)。

ColumnInfo类接口名 描述

boolean isNullable() 判断该字段是否能为null。

AdbClientException错误码错误码名 错误码值 描述

SQL_LENGTH_LIMIT 100 SQL长度超过限制的长度,默认为32k。

COMMIT_ERROR_DATA_LIST 101 提交中某些数据出现异常,会返回异常的数据,通过e.getErrData()即可获得异常数据List。

此错误码在addMap(s)、addRow(s)和提交操作的时候都可能会发生,需要单独处理此错误码的异常。

COMMIT_ERROR_OTHER 102 commit提交中的其他异常。

ADD_DATA_ERROR 103 新增数据过程中出现的异常。

CREATE_CONNECTION_ERROR 104 创建连接出现异常。

CLOSE_CONNECTION_ERROR 105 关闭连接出现异常。

CONFIG_ERROR 106 配置DatabaseConfig出现配置错误。

STOP_ERROR 107 停止实例时的报错。

OTHER 999 默认异常错误码。

示例代码publicclassAdbClientUsage{

publicvoiddemo(){

DatabaseConfigdatabaseConfig=newDatabaseConfig();

// 分析型数据库MySQL版的主机名或者URL

databaseConfig.setHost("100.100.100.100");

// 分析型数据库MySQL版的连接端口号

databaseConfig.setPort(8888);

// 分析型数据库MySQL版的所属账号的AccessKeyId

databaseConfig.setUser("your db username");

// 分析型数据库MySQL版的所属账号的AccessKeySecret

databaseConfig.setPassword("your db password");

databaseConfig.setDatabase("your db name");

// 设置需要写入的表名列表

Listtables=newArrayList();

tables.add("your table name");

tables.add("your table name 2");

// 一旦new Client实例之后,表配置是不可修改的

databaseConfig.setTable(tables);

// 设置需要写入的表字段

Listcolumns=newArrayList();

columns.add("column1");

columns.add("column2");

// 如果是所有字段,字段列表使用columns.add("*")即可

databaseConfig.setColumns("your table name",columns);

databaseConfig.setColumns("your table name 2",Collections.singletonList("*"));

// 如果出现插入失败,是否跳过

//忽略插入失败可能导致数据丢失

databaseConfig.setIgnoreInsertError(false);

//如果该列的值为空,则直接设置为null即可。

databaseConfig.setEmptyAsNull(true);

// 使用insert ignore into方式进行插入

databaseConfig.setInsertIgnore(true);

// 提交时,写入分析型数据库MySQL版出现异常时重试的3次

databaseConfig.setRetryTimes(3);

// 重试间隔的时间为1s,单位是ms

databaseConfig.setRetryIntervalTime(1000);

// 初始化AdbClient,初始化实例之后,databaseConfig的配置信息无法再进行修改

AdbClientadbClient=newAdbClient(databaseConfig);

// 数据需要攒批,分多次添加,再提交

for(inti=0;i<10;i++){

// Add row(s) to buffer. One instance for one record

Rowrow=newRow(columns.size());

// Set column

// the column index must be same as the sequence of columns

// the column value can be any type, internally it will be formatted according to column type

row.setColumn(0,i);// Number value

row.setColumn(1,"string value");// String value

// 如果SQL长度已满,则会在addRow或者addMap的时进行一次自动提交

// 如果提交失败,则返回AdbClientException异常,错误码为COMMIT_ERROR_DATA_LIST

adbClient.addRow("your table name",row);

}

Rowrow=newRow();

row.setColumn(0,10);// Number value

row.setColumn(1,"2018-01-01 08:00:00");//参数2的数据类型为 Date、Timestamp或者Time value

adbClient.addRow("your table name 2",row);

// Update column. Row实例可复用

row.updateColumn(0,11);

row.updateColumn(1,"2018-01-02 08:00:00");

adbClient.addRow("your table name 2",row);

// 将map加入缓存中

MaprowMap=newHashMap();

rowMap.put("column1","124");

rowMap.put("column2","string value");

// 数据需要攒批,最好多次添加之后再进行提交

adbClient.addMap("your table name",rowMap);

//将缓存中的数据提交到分析型数据库MySQL版

//数据成功提交到分析型数据库MySQL版之后,缓存中的数据会被清除

try{

adbClient.commit();

}catch(Exceptione){

}finally{

adbClient.stop();

}

}

}

注意事项ADB Client本身依赖 druid(1.1.10)、mysql-connector-java(5.1.45)、commons-lang3(3.4)、slf4j-api(1.7.25)、slf4j-log4j12(1.7.25),如果在使用过程中,出现版本冲突,请检查这几个包的版本并解决冲突。

ADB Client SDK是非线程安全的,如果多线程调用时,需要每个线程维护自己的Client对象。

强烈不建议多线程共用SDK实例,除了线程安全问题外,还容易使Client成为写入性能的瓶颈。

数据必须在调用commit成功后才算成功写入分析型数据库MySQL版。

针对Client抛出的异常,调用方要根据错误码的意义自行判断如何处理。如果是数据写入有问题,可以重复提交或者记录下有问题的数据后跳过。

很多时候写入线程并不是越多越好,因为业务程序会涉及到攒数据的场景,所以对内存的消耗比较明显,业务调用方一定要多关注应用程序的GC情况。

数据攒批数量不要太小,如果太小,分区聚合写意义就不大了。最好通过消息数*消息长度≈分区数*32k大概得出攒批的消息数。

DatabaseConfig配置在new AdbClient成功之后是无法进行修改,所有配置项必须在Client对象初始化之前完成配置。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39673293/article/details/113454533

智能推荐

Python 中实现装饰器时使用 @functools.wraps 的理由_weixin_30237281的博客-程序员宅基地

Python中使用装饰器对在运行期对函数进行一些外部功能的扩展。但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题。Python 通过functool.wraps为我们解决了这个问题:在编写装饰器时,在实现前加入@functools.wraps(func)可以保证装饰器不会对被装饰函数造成影响。比如,在 Flask 中,我们要...

Druid连接池引发的线上服务卡慢宕机问题_wf_feng的博客-程序员宅基地_druid连接池获取卡住

一、使用Druid背景&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;公司微服务产品改造上线后,在开发环境的时候,使用的是springboot默认的连接池HikariCP,为什么springboot2.0后选择的是HikariCP,可以参考博客,Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由----&gt;https://blog.csdn.net/liuhuiteng/article/details/10762753。&nbsp;&nbsp;&nbsp;&n

WF从入门到精通(第一章):WF简介_thy822的博客-程序员宅基地_wf从入门到精通

http://tech.ddvip.com/2008-09/122250806572034.html (豆豆网)http://file.ddvip.com/2008_09/1222508239_ddvip_5406.rar学习下面内容,你将掌握:     1.了解工作流的概念和理论     2.把WF和BizTalk与WCF做比较     3.开始使用WF进行编程     4.知道

PostgreSQL的JDBC访问_qwurey的博客-程序员宅基地

“过去的代码都是未经测试的代码” —— 无名

VB编程:用Shell函数打开记事本-54_彭世瑜的博客-程序员宅基地_vb编程:用shell函数打开记事本

Private Declare Function GetSystemDirectory Lib &quot;kernel32&quot;Alias &quot;GetSystemDirectoryA&quot; (ByVal lpBuffer As String, ByVal nSizeAs Long) As LongDim strtemp As String * 60Private Sub Co...

VMWare安装MAC OS X Snow Leopard 10.6安装经验_黑暗行动的博客-程序员宅基地

安装环境:Windows 7 Ultimate, 64-bit 6.1.7601, Service Pack 1VMware Workstation 10.0.1 build-1379776VMware Workstation 10.0(百度网盘下载:http://pan.baidu.com/s/1CI91k)破解机 百度网盘下载:http://pan.baidu.com/s/1jG2YSR0Ma

随便推点

Linux基础篇之内存管理机制_weixin_33910759的博客-程序员宅基地

1 Linux内存管理的主要特点无论物理内存多大,Linux都将其充分利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。Linux的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为cache、buffers,以此提高数据访问性能。...

vue使用webpack 打包性能分析插件 webpack-bundle-analyzer_叶蝶的博客-程序员宅基地

webpack 打包性能分析插件 webpack-bundle-analyzer在vue中使用webpack打包性能分析的插件安装1、安装插件:2、打开webpack.config.js文件运行webpack打包性能分析的插件插件:webpack-bundle-analyzer这个插件可以帮助我们分析webpack在打包过程中有哪些可以改进的地方。安装npm地址: https://www.npmjs.com/package/webpack-bundle-analyzer1、安装插件:npm i

图的最短路径之Floyd算法C/C++代码实现_Traving Yu的博客-程序员宅基地_floyd算法求最短路径c++

弗洛伊德Floyd算法:也称插点法,该算法用来求解每一对顶点之间的最短路径假设从顶点1到2,顶点3为过度中间顶点则:如果某个顶点位于从起点到终点的最短路径上:1-&gt;2=(1-&gt;3)+(3-&gt;2)如果某个顶点不在从起点到终点的最短路径上:1-&gt;2&lt;(1-&gt;3)+(3-&gt;2)总结:从i号顶点到j号顶点只经过前k号点的最短路径以该图为例:辅助数组的变化过程:代码如下:#include&lt;stdio.h&gt;#define MaxInt

安装Apache和PHP_oulix的博客-程序员宅基地_apache81 nas

Apache 2 and PHP InstallationThe following notes are how I got Apache 2 and PHP 5 (or PHP 4) working together on Linux. These instructions also apply, mostly, for any UNIX-like system, especially ot

HDFS中DataNode的心跳机制_aohuang8877的博客-程序员宅基地

DataNode心跳机制的作用讲解了DataNode的三个作用:register:当DataNode启动的时候,DataNode需要将自身的一些信息(hostname, version等)告诉NameNode,NameNode经过check后使其成为集群中的一员,然后信息维护在NetworkTopology中block report:将block的信息汇报给NameNode,...

如何做好需求调研_xzr2004的博客-程序员宅基地_什么是需求调研

<br />1前言<br />读者试用范围:需求调研人员、小组组长、开发人员等。<br />撰写本文目的:培训项目组成员需求调研过程中的工作技能。<br />需求调研是为需要说明书撰写做前期工作,需要说明书是从需求调研表中得到或抽取而出;是了解实际工作中真正需要什么样的程序的过程,再把这些需求细节整理由设计部开发,给用户使用。<br />需求调研在系统开发和部署试用阶段尤为重要,如何把项目组工作成果成功推广使用,得到用户的肯定认可是后期需求调研的重中之重。<br />开发软件系统最困难的部分就是准确说明开发

推荐文章

热门文章

相关标签