DM FLDR 编程指南

7.1 C 编程指南

7.1.1 接口介绍

快速装载接口 FLDR 是达梦数据库提供的能够快速将文本数据载入 DM 数据库的一种数据载入方式。用户通过使用 FLDR 接口能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到达梦数据库中。

本节介绍的为 FLDR 的 C 接口。

7.1.2 接口说明

7.1.2.1 返回值说明

DM FLDR 接口有以下五种返回值:

FLDR_SUCCESS:接口成功执行

FLDR_ERROR:接口执行出错

FLDR_INVALID_HANDLE:用户使用错误的句柄

FLDR_SUCCESS_WITH_INFO:接口执行成功但有警告信息

FLDR_NO_DATA:数据未找到

7.1.2.2 接口说明

  1. fldr_alloc

描述

用于分配快速装载对象实例,所有快速装载都将通过该句柄进行操作。

格式

FLDR_RETURN 
fldr_alloc(
	fhinstance	     *instance
);

参数

instance(输出):快速装载实例的句柄

返回值

FLDR_SUCCESS、FLDR_ERROR

说明

该函数分配出用于快速装载实例句柄,用户必须首先调用该函数获得快速装载的实例句柄,只有通过该句柄才能进行后续的快速装载操作。

  1. fldr_free

描述

释放快速装载实例句柄。

格式

FLDR_RETURN 
fldr_free(
	fhinstance	     instance
);

参数

instance(输入):快速装载实例的句柄。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

释放快速装载实例句柄,将该实例句柄上所有快速装载所占用的资源释放。

如果用户调用 fldr_initialize 进行初始化,而没有调用 fldr_uninitialize 通知装载结束,调用此函数将会自动结束该此装载,未使用 fldr_batch 或者 fldr_finish 进行提交的行将会被抛弃。

  1. fldr_set_attr

描述

设置快速装载实例的属性。

格式

FLDR_RETURN 
fldr_set_attr(
	fhinstance	     instance, 
	fsint4           attrid, 
	fpointer         value, 
	fsint4           length
);

参数

instance(输入):快速装载实例的句柄。

attrid(输入):属性。关于属性详细内容请参考表 7.1 属性介绍。

value(输入):属性值。

length(输入):属性值占用的空间大小,value 类型为字符串时使用。value 类型为整数时,该参数无意义。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

该函数可在调用 fldr_initialize 之前调用,用户可根据本地及服务器的环境特征设置本次快速装载的属性,从而获得较高的效率。

在 fldr_initialize 之后对该函数进行调用将返回执行不成功的错误。

表7.1 属性介绍
**属性(**attrid) 属性说明(value) value 类型
FLDR_ATTR_SERVER 服务器 IP 地址。缺省情况下为本地服务器 LOCALHOST 字符串
FLDR_ATTR_UID 用户名。不能缺省 字符串
FLDR_ATTR_PWD 密码。缺省情况下 SYSDBA 字符串
FLDR_ATTR_PORT 服务器端口。缺省情况下端口号为 5236 整数
FLDR_ATTR_TABLE 目标表 字符串
FLDR_ATTR_SET_INDENTITY 是否插入自增列。1 是,服务器将使用指定的数据作为自增列的数据进行插入;0 否,对于自增列服务器将自动生成数据插入,忽略指定的数据。缺省为 0 整数
FLDR_ATTR_DATA_SORTED 数据是否已按照聚集索引排序。缺省为 0。 1 表示用户必须保证数据已按照聚集索引排序完成,并且如果表中存在数据,需要插入的数据索引值要比表中数据的索引值大,服务器在做插入操作时顺序进行插入。0 表示服务器对于每条记录进行定位插入 整数
FLDR_ATTR_INDEX_OPTION 索引的设置选项,缺省为 1。 1:不刷新二级索引,数据按照索引先排序,装载完后再将排序的数据插入索引; 2:不刷新二级索引,数据装载完成后重建所有二级索引; 3:刷新二级索引,数据装载的同时将数据插入二级索引 整数
FLDR_ATTR_INSERT_ROWS 只读属性。当前发送到服务器的行数 整数
FLDR_ATTR_COMMIT_ROWS 只读属性。当前提交到数据库的行数 整数
FLDR_ATTR_PROCESS_ROWS 只读属性。用户绑定的数据行数 整数
FLDR_ATTR_SEND_NODE_NUM 指定数据载入时发送节点的个数,默认由系统计算一个初始值。取值范围为 16~65535。若在数据载入时发现发送节点不够用,系统会动态增加分配。在系统内存足够的情况下,可以适当设大 SEND_NODE_NUMBER 值,提升 dmfldr 载入性能 整数
FLDR_ATTR_TASK_THREAD_NUM 指定数据载入时处理用户数据的线程数目。默认情况下,dmfldr 将该参数值设为系统 CPU 的个数。在 dmfldr 客户端所在机器 CPU 大于 8 环境中,提高 TASK_THREAD_NUMBER 值可以提升 dmfldr 装载性能。取值范围为 1~128 整数
FLDR_ATTR_BAD_FILE 记录错误数据的文件绝对路径。缺省为 dmfldr.exe 所在目录。缺省的错误文件名为 fldr.bad。文件记录的信息为数据文件中存在格式错误的行数据以及转换出错的行数据 字符串
FLDR_ATTR_DATA_CHAR_SET 数据文件中数据的编码格式。默认与当前机器编码格式一致。取值有 GBK、GB18080、UTF-8、SINGLE_BYTE 和 EUC-KR 五种:GBK 和 GB18030 对应中文编码;UTF-8 对应 UTF-8 国际编码;SINGLE_BYTE 对应单字节字符编码;EUC-KR 对应韩文字符集 整数
FLDR_ATTR_LOG_FILE 指定日志文件绝对路径,缺省为 dmfldr.exe 所在目录。缺省日志文件名为 fldr.log。日志文件记录了 dmfldr 运行过程中的工作信息、错误信息以及统计信息 字符串
FLDR_ATTR_ERRORS_PERMIT 允许出现错误数据的行数,超过该值装载将报错。取值范围为 0~4294967295,缺省为 100 整数
FLDR_ATTR_SSL_PATH 通信加密的 SSL 数字证书路径,缺省为不使用加密。数字证书路径由用户自己创建,将相应的证书需放入该文件夹中。其中服务器证书必须与 dmserver 目录同级,客户端目录可以任意设置 字符串
FLDR_ATTR_SSL_PWD 通信加密的 SSL 数字证书密码。和 ssl_path 一起使用 字符串
FLDR_ATTR_LOCAL_CODE 指定本地字符集。取值为 UTF-8、GBK、BIG5、ISO 8859 9、EUC JP、EUC KR、KOI8R、ISO 8859 1、ISO 8859 11、ASCII 或 GB18030。缺省值是本地编码 整数
FLDR_ATTR_NULL_MODE 指定载入数据时对 NULL 字符串和空值的处理方式。取值 1 和 0,缺省为 0。 1 表示数据载入时将 NULL 字符串处理为空值,数据导出时则空值处理为 NULL 字符串;0 表示数据载入时将 NULL 字符串处理为字符串 整数
FLDR_ATTR_SERVER_BLDR_NUM 水平分区表装载时,指定服务器 BLDR 的最大个数,整数类型,取值范围为 1~1024,缺省为 64。 服务器的 BLDR 保存水平分区子表相关信息,BLDR_NUM 的设置也就指定了服务器能同时载入的水平分区子表的个数 整数
FLDR_ATTR_BDTA_SIZE BDTA(Batch DaTA)的大小,整数类型,取值范围为 100~10000,缺省为 5000。 BDTA 代表 DM 数据库批量数据处理机制中一个批量,在内存、CPU 允许的条件下,增大 BDTA_SIZE 能加快装载速度;在网络是装载性能瓶颈时,增大 BDTA_SIZE 影响不大 整数
FLDR_ATTR_COMPRESS_FLAG 指定是否压缩 BDTA。1 是;0 否。缺省为 0。 压缩 BDTA 能节省网络带宽,但同时也会加重 CPU 的负担,用户应根据具体应用情况考虑是否制定压缩 整数
FLDR_ATTR_FLUSH_FLAG 指定提交数据时服务器的处理方式。若设置为 1 则服务器将数据写入磁盘后才返回响应消息;若设置为 0 则服务器确认数据正确即返回响应消息,之后才将数据写入磁盘。缺省为 0 整数
FLDR_ATTR_MPP_CLIENT 当服务器环境为 MPP 环境时,若此参数值为 1,为客户端分发模式,数据在 FLDR 客户端分发好后直接往指定站点发送数据;若此参数值为 0,为本地分发模式,FLDR 客户端将数据全部发往连接的 MPP EP 站点。缺省值为 1 整数
FLDR_ATTR_DATA_PATH 指定数据文件路径 字符串
FLDR_ATTR_BUFFER_SIZE 指定读取文件缓冲区的页大小。取值范围为 1~2048,缺省为 10。单位为 MB 整数
FLDR_ATTR_LOB_DIRECTORY 指定 dmfldr 使用的大字段数据存放的目录 字符串
FLDR_ATTR_LOB_FIL_NAME 指定 dmfldr 导出大字段数据的文件名。缺省为 dmfldr.lob 字符串
FLDR_ATTR_BLOB_TYPE 指定 BLOB 数据值的实际类型。取值:HEX 表示值为十六进制;HEX_CHAR 表示值为十六进制字符。缺省为 HEX_CHAR 字符串
FLDR_ATTR_ENABLE_CLASS_TYPE 指定是否以 BLOB 方式导入导出 CLASS 类型列数据。缺省为 FALSE 布尔类型
FLDR_ATTR_CONFLICT_FLAG 指定是否忽略唯一性冲突。缺省为 FALSE 布尔类型
  1. fldr_get_attr

描述

获取快速装载实例的属性。

格式

FLDR_RETURN 
fldr_get_attr(
	fhinstance	   	instance, 
	fsint4    		attrid, 
	fpointer    	buffer, 
	fsint4    		buf_sz,
	fsint4*			length
);

参数

instance(输入):快速装载实例的句柄。

attrid(输入):属性标识,指出将要获取的属性,关于属性详细内容参见 fldr_set_attr()的说明部分。

buffer(输出):将属性值填入 buffer 所指向的内存中。

buf_sz(输入):属性缓冲区的长度。

length(输出):向 buffer 指向的缓冲区填写的数据的长度。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

参见 fldr_set_attr()函数说明中各属性说明。

  1. fldr_initialize

描述

初始化当前快速装载实例。

格式

FLDR_RETURN 
fldr_initialize(
	fhinstance	   	instance, 
	fint4          	type,
	fpointer       	conn,
	fchar*        	server, 
	fchar *        	uid, 
	fchar*        	pwd,
	fchar*        	table
);

参数

instance(输入):快速装载实例的句柄。

type(输入):可用值为 FLDR_TYPE_BIND:用户使用绑定方式进行装载。

conn(输入):通过 dpi 分配的连接对象,如果该参数不为 NULL 值,则使用用户指定的连接作为导入的连接,忽略 server,uid,pwd 这三个参数。

server(输入):链接的服务器。将被记录到实例的 FLDR_ATTR_SERVER 属性中。

uid(输出):登录用户。将被记录到实例的 FLDR_ATTR_UID 属性中。

pwd(输入):用户密码。将被记录到实例的 FLDR_ATTR_PWD 属性中。

table(输入):进行快速装载的表。将被记录到实例的 FLDR_ATTR_TABLE 属性中。

返回值

FLDR_SUCCESS、FLDR_SUCCESS_WITH_INFO、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

根据用户通过 fldr_set_attr 设置的属性初始化快速装载环境,如果用户未指定连接则根据用户提供的服务器、用户和密码建立到服务器的连接。

  1. fldr_uninitialize

描述

释放快速装载实例所占用的资源。

格式

FLDR_RETURN 
fldr_uninitialize(
	fhinstance	     instance,
	fint4            flag
);

参数

instance(输入):快速装载实例的句柄。

flag(输入):指出是否对已插入的数据进行事务提交,以永久保存到数据库。取值:FLDR_UNINITILIAZE_COMMIT 为是,FLDR_UNINITILIAZE_ROLLBACK 为否。如果用户调用了 fldr_finish 结束导入则该参数将不会起任何作用。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

用于释放所占用快速装载实例所占用的资源。用户在调用该函数后可重新初始化快速装载句柄,进行新的数据装载。

  1. fldr_bind

描述

绑定输入列。

格式

FLDR_RETURN 
fldr_bind(
	fhinstance	   	instance,
	fsint2        	col_idx,
	fsint2        	type,
	fchar*			date_fmt,
	fpointer        data,
	fsint4        	data_len,
	fsint4*       	ind_len
);

参数

instance(输入):快速装载实例的句柄。

col_idx(输入):绑定列的编号。从 1 开始计数,对应快速装载的表的相应列。

type(输入):用户绑定数据的 C 类型。

date_fmt(输入):当绑定列对应的表的列为时间日期类型,且绑定的 c 数据为 FLDR_C_CHAR 类型,该参数为字符串到日期类型的格式串。其他情况,忽略该绑定输入。

data(输入):指向用于存放数据内存的地址指针,可在 fldr_sendrows 之前对其进行填充,快速装载接口在用户调用 fldr_sendrows 时读取数据内容。

data_len(输入):用于记录单行数据最大的长度。当进行多行绑定的时候,对于变长的 C 类型,根据该参数内容进行便宜的计算。对于固定长度的 C 数据类型,该参数内容被忽略。

ind_len(输入):用户绑定的数据长度指示符。当为批量绑定时,传入的地址为指向 fsint4 类型的数组。如果地址中保存的值为 FLDR_DATA_NULL,绑定列的该行数据被视为空值。对于 FLDR_C_BINARY 和 FLDR_C_CHAR 变长数据类型,用来指明数据的长度。对于其他定长数据类型,忽略其长度。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

支持绑定的 C 类型见下表:

类型 宏定义 说明
二进制数据 FLDR_C_BINARY 变长
字符数据 FLDR_C_CHAR 变长
1 字节整型数据 FLDR_C_BYTE 定长
2 字节整型数据 FLDR_C_SHORT 定长
4 字节整型数据 FLDR_C_INT 定长
8 字节整型数据 FLDR_C_BIGINT 定长
单精度浮点数 FLDR_C_FLOAT 定长
双精度浮点数 FLDR_C_DOUBLE 定长
  1. fldr_bind_nth

描述

绑定输入列,fldr_bind 的多线程版本。

格式

FLDR_RETURN 
fldr_bind_nth(
    fhinstance	    instance,
    fsint2          col_idx,
    fsint2	        type,
    fchar*          date_fmt,
    fpointer        str_binds,
    fpointer        data,
    fsint4          col_len,
    fsint4          data_len,
    fsint4*         ind_len,
    fsint4          nth
);

参数

instance(输入):快速装载实例的句柄。

col_idx(输入):绑定列的编号。从 1 开始计数,对应快速装载的表的相应列。

type(输入):用户绑定数据的 C 类型。

date_fmt(输入):当绑定列对应的表的列为时间日期类型,且绑定的 c 数据为 FLDR_C_CHAR 类型,该参数为字符串到日期类型的格式串。其他情况,忽略该绑定输入。

str_binds(输入):字符串绑定内存。

data(输入):指向用于存放数据内存的地址指针,可在 fldr_sendrows 之前对其进行填充,快速装载接口在用户调用 fldr_sendrows 时读取数据内容。

col_len(输入):列定义长度。

data_len(输入):用于记录单行数据最大的长度。当进行多行绑定的时候,对于变长的 C 类型,根据该参数内容进行便宜的计算。对于固定长度的 C 数据类型,该参数内容被忽略。

ind_len(输入):用户绑定的数据长度指示符。当为批量绑定时,传入的地址为指向 fsint4 类型的数组。如果地址中保存的值为 FLDR_DATA_NULL,绑定列的该行数据被视为空值。对于 FLDR_C_BINARY 和 FLDR_C_CHAR 变长数据类型,用来指明数据的长度。对于其他定长数据类型,忽略其长度。

nth(输入):多线程绑定,第几个线程,从 0 开始。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

支持绑定的 C 类型见下表:

类型 宏定义 说明
二进制数据 FLDR_C_BINARY 变长
字符数据 FLDR_C_CHAR 变长
1 字节整型数据 FLDR_C_BYTE 定长
2 字节整型数据 FLDR_C_SHORT 定长
4 字节整型数据 FLDR_C_INT 定长
8 字节整型数据 FLDR_C_BIGINT 定长
单精度浮点数 FLDR_C_FLOAT 定长
双精度浮点数 FLDR_C_DOUBLE 定长
  1. fldr_sendrows

描述

发送行数。

格式

FLDR_RETURN 
fldr_sendrows(
	fhinstance	     instance,
	fint4            rows
);

参数

instance(输入):快速装载实例的句柄。

rows(输入):在多行绑定的情况,指明绑定的行数。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

  1. fldr_sendrows_nth

描述

发送行数,fldr_sendrows 的多线程版本。

格式

FLDR_RETURN 
fldr_sendrows_nth(
	fhinstance	    instance,
	fsint4          rows,
	fsint4          nth,
	fsint4          seq_no
);

参数

instance(输入):快速装载实例的句柄。

rows(输入):在多行绑定的情况,指明绑定的行数。

nth(输入):多线程版本,第几个线程。

seq_no(输入):数据批次的序号。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

  1. fldr_batch

描述

批量提交行数据,永久保存到服务器。

格式

FLDR_RETURN 
fldr_batch(
	fhinstance	     instance,
	fsint8           *rows
);

参数

instance(输入):快速装载实例的句柄。

rows(输出):批量提交的行数。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

说明

将上一次调用 fldr_batch 之后所有 fldr_sendrows 装载的行进行提交,永久保存到数据库中。

  1. fldr_finish

描述

结束一次批量操作。

格式

FLDR_RETURN 
fldr_finish(
	fhinstance	     instance
);

参数

instance(输入):快速装载实例的句柄

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE

  1. fldr_get_diag

描述

获取出错时的诊断信息。

格式:

FLDR_RETURN 
fldr_get_diag(
	fhinstance	   	instance,
	fsint4			rec_num,
	fsint4*         err_code,
	fchar*         	err_msg,
	fsint4          buf_sz,
	fsint4*         msg_len
);

参数

instance(输入):快速装载实例的句柄。

rec_num(输入):诊断信息索引号。

err_code(输出):发生错误的错误码。

err_msg(输出):错误消息缓冲区。

buf_sz(输入):缓冲区大小。

msg_len(输出):错误信息在缓冲区中占用的大小。

返回值

FLDR_SUCCESS、FLDR_ERROR、FLDR_INVALID_HANDLE、FLDR_NO_DATA

说明

当用户调用快速装载接口返回 FLDR_ERROR 时,可通过该函数获取出错的错误信息,进行当前状况的判断。该函数出现错误将不会生成任何诊断信息。

  1. fldr_exec_ctl_low

描述

类似命令行工具,通过控制文件,执行数据装载。

格式

FLDR_RETURN
fldr_exec_ctl_low(
	fhinstance      instance,
    fchar*          ctl_buffer,
    fsint4          fldr_type,
    fsint8*         row_count   
);

参数

instance(输入):快速装载实例的句柄。

ctl_buffer(输入):控制文件 buffer。

fldr_type(输入):数据装载类型。

row_count(输出):返回成功装载的行数。仅支持载入行数,不支持载出行数。

返回值

FLDR_SUCCESS、FLDR_ERROR

说明

此接口让用户可以通过自定义程序实现数据快速装载。

7.1.3 基本示例

程序在编译的过程中需要用到 DM 的头文件 fldr.h,在连接阶段需要用到 dmfldr_dll.lib 这个库文件,在执行阶段需要用到动态库 dmfldr_dll.dll、dmbcast.dll、dmcalc.dll、dmelog.dll、dmmem.dll、dmos.dll、dmutl.dll、dmdta.dll、dmcfg.dll、dmstrt.dll、dmcpr.dll、dmcyt.dll、dmcvt.dll、dmmout.dll、dmcomm.dll、dmdpi.dll、dmclientlex.dll、dmfldr_comm.dll。这几个动态库在安装 DM 时,已经被放到安装目录下。

##include "fldr.h"
##include <stdio.h>
##include <stdlib.h>
##include <string.h>

int
main()
{
    fhinstance      instance;
    FLDR_RETURN     ret;
    char            server[20] = "192.168.0.35";
    char            user[20] = "SYSDBA";
    char            pwd[20] = "SYSDBA";
    char            table[20] = "TEST";   
// 提前建好表CREATE TABLE TEST(C1 INT, C2 VARCHAR2(100));
    int             c1[100];
    int             c1_len[100];
    char            c2[100][100];
    int             c2_len[100];
    int             i;

    for (i = 0; i < 100; i++)
    {
        c1[i]   = i;
        sprintf(c2[i], "i = %d", i);
        c2_len[i] = strlen(c2[i]);
    }

    ret = fldr_alloc(&instance);  
    fldr_initialize(instance, FLDR_TYPE_BIND, NULL, server, user, pwd, table);
    fldr_bind_nth(instance, 1, FLDR_C_INT, NULL, NULL, c1, 4, 0, c1_len, 0);
    fldr_bind_nth(instance, 2, FLDR_C_CHAR, NULL, NULL, c2, 100, 100*100, c2_len, 0);
    fldr_sendrows_nth(instance, 100, 0, 1);  
    fldr_uninitialize(instance, FLDR_UNINITILIAZE_COMMIT);
    fldr_free(instance);
    return 0;
}

7.2 JNI 编程指南

7.2.1 接口介绍

java 调用 dm 快速装载接口导数据是通过 jni 接口来完成的。所引用的对象在 com.dameng.floader.jar 中的 com.dameng.floader.Instance,com.dameng.floader.Properties。主要类是 com.dameng.floader.Instance。

7.2.2 接口说明

  1. allocInstance

描述

用于分配快速装载对象实例,所有快速装载都将通过该句柄进行操作。

格式

boolean
allocInstance();

参数

无。

返回值

true 或 false

说明

该函数分配出用于快速装载实例句柄,用户必须首先调用该函数获得快速装载的实例句柄,只有通过该句柄才能进行后续的快速装载操作。

  1. free

描述

释放快速装载实例句柄。

格式

void
free();

参数

无。

返回值

无。

说明

释放快速装载实例句柄,将该实例句柄上所有快速装载所占用的资源释放。

  1. setAttribute

描述

设置快速装载实例的属性。

格式

boolean
setAttribute(
	int 		attr_id,
	String 		value
);

参数

attr_id(输入):属性标识,指出将要设置的属性,关于属性详细内容请参考表 7.1 属性介绍。

value(输入):属性值,根据 attrid 不同该参数的意义不同。

返回值

true,false

  1. getAttribute

描述

获取快速装载实例的属性。

格式

String
getAttribute(
	int 	attr_id
);

参数

attrid(输入):属性标识,指出将要获取的属性,关于属性详细内容参见 setAttribute 的说明部分。

返回值

属性值。

说明

参见 setAttribute 函数说明中各属性说明。

  1. initializeInstance

描述

初始化当前快速装载实例。

格式

boolean
initializeInstance(
	String 		server,
	String 		user,
	String 		pwd,
	String 		table
);

参数

server(输入):链接的服务器。将被记录到实例的 FLDR_ATTR_SERVER 属性中。

user(输入):登录用户。将被记录到实例的 FLDR_ATTR_UID 属性中。

pwd(输入):用户密码。将被记录到实例的 FLDR_ATTR_PWD 属性中。

table(输入):进行快速装载的表。将被记录到实例的 FLDR_ATTR_TABLE 属性中。

返回值

true,false

说明

根据用户通过 setAttribute 设置的属性初始化快速装载环境,如果用户未指定连接则根据用户提供的服务器、用户和密码建立到服务器的连接。

  1. uninitialize

描述

释放快速装载实例所占用的资源。

格式

boolean
uninitialize();

参数

无。

返回值

true,false

说明

用于释放所占用快速装载实例所占用的资源。用户在调用该函数后可重新初始化快速装载句柄,进行新的数据装载。

7.fldr_Bind_Columns_ex

描述

绑定输入列。

格式

boolean
fldr_Bind_Columns_ex(
	int 		colNumber, 
	int 		type, 
	String 		datefmt, 
	Object 		data, 
	int 		maxcollen,
	int[] 		ind_len, 
	int 		threadNum
);

参数

colNumber(输入):绑定列的编号。从 1 开始计数,对应快速装载的表的相应列。

type(输入):用户绑定数据的 JAVA 类型。此处 FLDR JNI 调用的 JAVA 数据类型是从 com.dameng.floader.DataTypes 里进行调用。[第 4 章 DM JDBC 编程指南](#第 4 章 DM JDBC 编程指南)中 JDBC 接口调用 JAVA 数据类型是从 java.sql.Types 里进行调用。com.dameng.floader.DataTypes 的数据类型与 java.sql.Types 的数据类型并不相同,两者的差异见下表:

com.dameng.floader.DataTypes(FLDR JNI) java.sql.Types(JDBC接口)
DataTypes.FLDR_C_TINYINT Types.BIT
Types.BOOLEAN
Types.TINYINT
DataTypes.FLDR_C_SHORT Types.SMALLINT
DataTypes.FLDR_C_INT Types.INTEGER
DataTypes.FLDR_C_BIGINT Types.BIGINT
DataTypes.FLDR_C_BINARY Types.STRUCT
Types.BINARY
Types.VARBINARY
Types.LONGVARBINARY
Types.BLOB
DataTypes.FLDR_C_CHAR 其他

datefmt(输入):当绑定列对应的表的列为时间日期类型,且绑定的 JAVA 数据为 String 类型,该参数为字符串到日期类型的格式串。其他情况,忽略该绑定输入。

data(输入):指向用于存放数据内存的地址指针。

maxcollen(输入):用于记录单行数据最大的长度。当进行多行绑定的时候,对于变长的 C 类型,根据该参数内容进行便宜的计算。对于固定长度的 JAVA 数据类型,该参数内容被忽略。

ind_len(输入):用户绑定的数据长度指示符。当为批量绑定时,传入的地址为指向 INT 类型的数组。如果地址中保存的值为-1,绑定列的该行数据被视为空值。对于 BINARY 和 CHAR 变长数据类型,用来指明数据的长度。对于其他定长数据类型,忽略其长度。

threadNum(输入):多线程调用,线程序号,单线程传 0。

返回值

true,false

  1. fldr_Bind_Columns_Direct_ex

描述

绑定输入列。功能与 fldr_Bind_Columns_ex 函数相同,fldr_Bind_Columns_Direct_ex 仅支持绑定字符串类型数据,且通常结合 JAVA 的直接内存使用,可以减少 JNI 内存拷贝。

格式

boolean

fldr_Bind_Columns_Direct_ex(

	int			colNumber, 

	int 		type, 

	String 		datefmt, 

	Object		data, 

	int 		maxcollen,

	int[] 		ind_len, 

	int 		threadNum

);

参数

type(输入):用户绑定数据的 JAVA 类型。此处仅支持 DataTypes.FLDR_C_CHAR。

data(输入):指向用于存放数据内存的地址指针。通常使用 JAVA 的直接内存地址指针。

其余参数请参考 fldr_Bind_Columns_ex 函数的参数说明。

返回值

true,false

  1. fldr_Send_Rows_ex

描述

发送行数。

格式

boolean
fldr_Send_Rows_ex(
long rows, 
int threadNum, 
int seqNo
);

参数

rows(输入):在多行绑定的情况,指明绑定的行数。

threadNum(输入):多线程调用,线程序号,单线程传 0。

seqNo(输入):数据批次,从 1 开始自增,保证数据有序。

返回值

true,false

  1. setControl

描述

利用控制文件执行数据装载。

格式

long

setControl(

  String   ctrl

);

参数

ctrl(输入):控制文件的内容。

返回值

成功装载的行数。

  1. batch

描述

批量提交行数据,永久保存到服务器。

格式

long

batch();

参数

无。

返回值

批量提交的行数。

说明

将上一次调用 batch 之后所有 fldr_Send_Rows_ex 装载的行进行提交,永久保存到数据库中。

  1. finish

描述

结束一次批量操作。

格式

boolean

finish();

参数

无。

返回值:

true,false

7.2.3 基本示例

例 1 将数据导入到数据库。

package com.dameng;
import java.io.File;
import com.dameng.floader.DataTypes;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;

public class TestFloder
{

    public static void main(String[] args)
    {
        Instance instance = new Instance();

        int threadNum = 1;

        TestFloder floder = new TestFloder();
        /* ***************************初始化******************************* */
        /* create table sysdba.test1(c1 int ,c2 varchar(50)); */
        String tableName = "SYSDBA.TEST1";
        boolean success = floder.init(instance, threadNum, tableName);
    
        if (success)
        {
            try
            {
            	int		c1[] = {1,2,3,4,5,6,7,8,9};		//数据
            	int		c1_ind[] = {4,4,4,4,4,4,4,4,4};	//长度指示符  -1表示空
            	byte[] 	byteArray = new byte[9];
        
            	for (int i = 0; i < 9; i++)
            	{
            		byteArray[i] = ((Integer)c1[i]).byteValue();
            	}
        
        
            	String	c2[] = {"a1","a12","a123","a1234","a12345","a123456","a1234567","a12345678","a123456789"};
            	int		c2_ind[] = {2,3,4,5,6,7,8,9,10};	//长度指示符  -1表示空
            	byte[][] 	byteArray2 = new byte[9][];
        
            	for (int i = 0; i < 9; i++)
            	{
            		byteArray2[i] = c2[i].getBytes();
            	}       

            	/*
            	fldr_Bind_Columns_ex(
            	int colNumber,			// 列号 从1开始 
            	int type, 				// 列类型从DataTypes取
            	String datefmt, 		// 时间类型格式范式:默认yyyy-mm-dd hh-mm-ss,为空的话,按默认处理
            	Object data, 			// 数值类型直接使数值类型数组,字符串类型是byte数组
            	int maxcollen,			// 数值类型值无效,fldr里面自己按sizeof取长度。,
            							// xxxxxxxxxxxxx注意字符串类型是所有数据总长度xxxxxxxxxxxxxxxxxxx。
            							// fldr里面要按这个总长度申请类型
            	int[] ind_len, 			// 长度指示符,int数组,-1标示空
            							// 数值类型无效,字符串类型标示数据长度。
            	int threadNum			// 多线程下有效,单线程传1
            	)
            	 */
        
            	/*
            	fldr_Send_Rows_ex(
            	long rows,				// 行数 
            	int threadNum, 			// 多线程下有效,单线程传1
            	int seqNo				// 数据批次号,从1开始,必须连续,否则fldr会卡住。
            	)
            	*/
        
            	for (int i = 1; i < 10; i++)
            	{
            		instance.fldr_Bind_Columns_ex(1, DataTypes.FLDR_C_INT, null, c1, 4, c1_ind, 1);
                    instance.fldr_Bind_Columns_ex(2, DataTypes.FLDR_C_CHAR, null, byteArray2, 54, c2_ind, 1);
                
                    instance.fldr_Send_Rows_ex(9, 1, i);
            	}
            

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
    
        /* ***************************释放******************************* */
        if (!success)
        {
            String message = instance.getErrorMsg();
            System.out.println("出错信息:" + message);
            instance.free();
        }
        else
        {
            instance.finish();
            // 返回实际插入的行数
            long rowHaveCopied = Long.parseLong(instance.getAttribute(Properties.FLDR_ATTR_COMMIT_ROWS));
            System.out.println("已复制行数:" + rowHaveCopied);
            instance.uninitialize();
            instance.free();
        }

    }

    // 初始化
    public boolean init(Instance instance, int threadNum, String tableName)
    {
        // 分配句柄
        instance.allocInstance();
        // 设置属性
        String host = "localhost";
        String port = "5236";
        String userName = "SYSDBA";
        String password = "SYSDBA";
        instance.setAttribute(Properties.FLDR_ATTR_SERVER, host);
        instance.setAttribute(Properties.FLDR_ATTR_PORT, port);
        instance.setAttribute(Properties.FLDR_ATTR_UID, userName);
        instance.setAttribute(Properties.FLDR_ATTR_PWD, password);

        // 编码
//        instance.setAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET, System.getProperty("file.encoding"));

        // 是否有自增量
//        instance.setAttribute(Properties.FLDR_ATTR_SET_INDENTITY, "0");

        // fldr task线程默认为cpu个数,如果客户端线程数大于cpu个数,则必须设置该参数
//        instance.setAttribute(Properties.FLDR_ATTR_TASK_THREAD_NUM, String.valueOf(threadNum));

        // 记录出错的信息
        String dmHome = System.getProperty("DM_HOME");
        if (dmHome != null && !dmHome.equals(""))
        {
            if (dmHome.endsWith("/") || dmHome.endsWith("\\"))
            {
                instance.setAttribute(Properties.FLDR_ATTR_BAD_FILE, dmHome + "BADFILE.TXT");
            }
            else
            {
                instance.setAttribute(Properties.FLDR_ATTR_BAD_FILE, dmHome + File.separator + "BADFILE.TXT");
            }
        }

        // 装载日志
        if (dmHome != null && !dmHome.equals(""))
        {
            if (dmHome.endsWith("/") || dmHome.endsWith("\\"))
            {
                instance.setAttribute(Properties.FLDR_ATTR_LOG_FILE, dmHome + "FLDR_LOG.TXT");
            }
            else
            {
                instance.setAttribute(Properties.FLDR_ATTR_LOG_FILE, dmHome + File.separator + "FLDR_LOG.TXT");
            }
        }

        // 最大容错个数
//        instance.setAttribute(Properties.FLDR_ATTR_ERRORS_PERMIT, String.valueOf(Integer.MAX_VALUE));

        // 是否为mpp
//        instance.setAttribute(Properties.FLDR_ATTR_MPP_CLIENT, "0");

        // 如果是txt到dm8
//            instance.setAttribute(Properties.FLDR_ATTR_COMPRESS_FLAG,  "0");
//            instance.setAttribute(Properties.FLDR_ATTR_DIRECT_MODE,"0");
//            instance.setAttribute(Properties.FLDR_ATTR_DATA_SORTED, "0");
//            instance.setAttribute(Properties.FLDR_ATTR_LOCAL_CODE, "GBK");
//            instance.setAttribute(Properties.FLDR_ATTR_BLOB_TYPE, "0");
//            instance.setAttribute(Properties.FLDR_ATTR_INDEX_OPTION,"1");
//            instance.setAttribute(Properties.FLDR_ATTR_LOB_DIRECTORY, "");
//            instance.setAttribute(Properties.FLDR_ATTR_ERRORS_PERMIT,"1000");
//            instance.setAttribute(Properties.FLDR_ATTR_SKIP_ROWS,"0");
//            instance.setAttribute(Properties.FLDR_ATTR_BUFFER_SIZE,"512");
//            instance.setAttribute(Properties.FLDR_ATTR_SERVER_BLDR_NUM,"512");
//            instance.setAttribute(Properties.FLDR_ATTR_READ_ROWS,"512");
//            instance.setAttribute(Properties.FLDR_ATTR_ROWS_COMMIT,"512");
//            instance.setAttribute(Properties.FLDR_ATTR_BDTA_SIZE,"512");

        boolean success = instance.initializeInstance(null, null, null, tableName);
        return success;
    }
}

例 2 将数据库表中的数据导出到文件中

第一步,数据准备,创建数据库表 test。

create table test(c1 int);

insert into test values(1),(2),(3);

commit;

第二步,将表 test 中的数据导出到文件 e:\fldr_out.txt 中。

package com.dameng;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;

public class TestFloder {
	public static void main(String[] args)
    {
		Instance instance = new Instance();
		try
        {
             //初始化
            if (instance.allocInstance())
            {
                instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.1.55");
                instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");
                instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");
                instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");
                instance.setAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET, "GBK");
            
                instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");
                String ctl = "OPTIONS\r\n" + 
                        "(\r\n" + 
                        "mode='out'\r\n" + 
                        ")\r\n" + 
                        "Load\r\n" + 
                        "infile 'e:\\fldr_out.txt'\r\n" + 
                        "Append\r\n" + 
                        "into table \"SYSDBA\".\"TEST\"\r\n" + 
                        "FIELDS '|'";
                //导出的ctrl内容
                instance.setControl(ctl);
            }
            else
            {
                System.out.println(instance.getErrorMsg());
            }
        }
        finally
        {
            //释放
            instance.uninitialize();
            instance.free();
        }
    }
}

第三步,查看文件 e:\fldr_out.txt。

1

2

3
微信扫码
分享文档
扫一扫
联系客服