华为云用户手册

  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB(DWS)进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。 样例程序如下,执行时需要加载GaussDB(DWS) jdbc驱动。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100101102103104 //以下用例以gsjdbc4.jar为例,如果要使用gsjdbc200.jar,请替换驱动类名(将代码中的“org.postgresql”替换成“com.huawei.gauss200.jdbc”)与连接URL串前缀(将“jdbc:postgresql”替换为“jdbc:gaussdb”)。import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException;import java.io.FileInputStream;import java.io.FileOutputStream;import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //数据库URL String username = new String("jack"); //用户名 String password = new String("********"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 使用COPY FROM STDIN导入数据
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 原因 解决办法 missing data for column "r_reason_desc" 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
  • 常用方法 表1 CopyManager常用方法 返回值 方法 描述 throws CopyIn copyIn(String sql) - SQLException long copyIn(String sql, InputStream from) 使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。 SQLException,IOException long copyIn(String sql, InputStream from, int bufferSize) 使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。 SQLException,IOException long copyIn(String sql, Reader from) 使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。 SQLException,IOException long copyIn(String sql, Reader from, int bufferSize) 使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。 SQLException,IOException CopyOut copyOut(String sql) - SQLException long copyOut(String sql, OutputStream to) 将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。 SQLException,IOException long copyOut(String sql, Writer to) 将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。 SQLException,IOException
  • 任务示例 除了以下示例,更多外表创建的示例请参考GDS导入示例。 示例1:创建GDS外表foreign_tpcds_reasons,数据格式为CSV。 1234567 CREATE FOREIGN TABLE foreign_tpcds_reasons( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'CSV',MODE 'Normal', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL ''); 示例2:创建GDS导入外表foreign_tpcds_reasons_SSL,使用SSL加密传输的模式传输,数据格式为CSV。 1234567 CREATE FOREIGN TABLE foreign_tpcds_reasons_SSL( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) SERVER gsmpp_server OPTIONS (location 'gsfss://192.168.0.90:5000/* | gsfss://192.168.0.91:5000/*', FORMAT 'CSV',MODE 'Normal', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL ''); 示例3:创建GDS外表foreign_tpcds_reasons,数据格式为TEXT。 123456 CREATE FOREIGN TABLE foreign_tpcds_reasons( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'TEXT', delimiter E'\x08', null '',reject_limit '2',EOL '0x0D') WITH err_foreign_tpcds_reasons;
  • 操作步骤 收集数据源格式信息、GDS服务的访问信息。 需要收集的主要数据源格式信息如下: format:GDS外表导入支持CSV、TEXT和FIXED格式。请确认存放在数据服务器上待入库数据的格式。例如,假设待入库的数据为CSV格式。 header(仅支持CSV,FIXED格式):确认数据文件是否包含标题行。 delimiter:确认数据文件中,字段间的分隔符。例如,假设是以英文逗号分隔的。 encoding:数据源文件的数据编码格式。例如,假设为UTF-8。 eol:确认数据文件中,行间的换行符。例如,默认的换行符,如0x0D0A、0X0A,或者自定义的换行符,如字符串!@#。该参数仅支持TEXT格式导入。 外表可识别的其他更多格式信息请参见数据格式参数。 需要收集的GDS服务的访问信息如下: location:GDS服务的访问地址。例如以安装配置和启动GDS中的GDS信息为例。非SSL模式下的location为:gsfs://192.168.0.90:5000//input_data/ 。SSL模式下的location为:gsfss://192.168.0.90:5000//input_data/ 。其中,“192.168.0.90:5000”为GDS服务的IP及端口号;“input_data”为GDS服务管理的数据源文件所在的路径。请根据实际情况替换。 依据数据源文件中的数据情况,设计导入容错机制。 GaussDB(DWS)支持如下的数据容错性处理,相当于数据入库前对数据做初步的简单清洗。 fill_missing_fields:数据入库时,数据源文件中某行的最后一个字段缺失时,请选择是直接将字段设为Null,还是在错误表中报错提示。 ignore_extra_data:数据源文件中的字段比外表定义列数多时,请选择是忽略多出的列,还是在错误表中报错提示。 per node reject_limit:本次数据导入过程中每个DN实例上允许出现的数据格式错误的数量。如果有一个DN实例上录入错误表中的错误数量超过设定值时,本次导入失败,报错退出。可以选择不做限制,也可以根据所能容忍的错误数量选择一个上限值。 compatible_illegal_chars:导入时遇到非法字符,选择如何处理。是将非法字符按照转换规则转换后入库,还是报错中止导入。 非法字符容错转换规则如下: 对于'\0',容错后转换为空格。 对于其他非法字符,容错后转换为问号。 对非法字符进行容错转换时,如遇NULL、DELIMITER、QUOTE、ESCAPE也设置成了空格或问号,GaussDB(DWS)会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。 error_table_name:用于记录数据格式错误信息的错误表表名。并行导入结束后查询此错误信息表,能够获取详细的错误信息。 remote log 'name':数据导入过程中的数据格式错误信息是否同时在GDS服务器上以文件方式保存。name为错误数据文件的文件名前缀。 关于容错性参数的更多信息请参考容错性参数。 使用gsql或Data Studio连接数据库后,根据前面步骤所收集和规划的信息参数,创建GDS外表。 示例如下: 1 2 3 4 5 6 7 8 910111213141516171819 CREATE FOREIGN TABLE foreign_tpcds_reasons( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100)) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'CSV' ,DELIMITER ',',ENCODING 'utf8',HEADER 'false',FILL_MISSING_FIELDS 'true',IGNORE_EXTRA_DATA 'true')LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited'; 示例中的各项说明如下: 外表字段需与数据库中即将存储数据的事实表保持一致。 对于GDS导入,SERVER gsmpp_server请保持不变。 location参数请根据1中收集的GDS服务访问信息修改。注意GDS使用SSL加密传输时,需要将“gsfs”替换为“gsfss”。 FORMAT、DELIMITER、ENCODING、HEADER请根据1中收集的数据源格式信息填写。 FILL_MISSING_FIELDS、IGNORE_EXTRA_DATA、LOG INTO及PER NODE REJECT LIMIT请根据2中设计的导入容错机制填写。注意LOG INTO是指将数据格式错误录入哪个错误表,即其取值为错误表表名。 CREATE FOREIGN TABLE语法的更多信息,请参考CREATE FOREIGN TABLE (GDS导入导出)。
  • 操作步骤 在GaussDB(DWS)中创建目标表,用于存储导入的数据。建表语句请参见CREATE TABLE。 (可选)若导入表存在索引,在数据导入过程中,将增量更新索引信息,影响数据导入性能。建议在执行数据导入前,先删除相关表的索引,但是如果不能保证数据唯一性不建议删除唯一索引。在数据导入完成后,再重新创建索引。 假定在导入表“product_info”上的“product_id”字段上存在普通索引“product_idx”。在执行数据导入前,请先删除相关索引。 1 DROP INDEX product_idx; 在数据导入完成后,重建索引。 1 CREATE INDEX product_idx ON product_info(product_id); 执行数据导入。 1 INSERT INTO [目标表名] SELECT * FROM [foreign table 表名]; 若出现以下类似信息,说明数据导入成功。请查询错误信息表,查看是否存在数据格式错误,详细操作请参见处理错误表。 INSERT 0 9 若出现数据加载错误,请参见处理错误表,并重新执行数据导入。 若执行过程中出现数据加载错误,则数据全部导入失败,没有数据导入至目标表中。 编写批处理任务脚本,实现并发批量导入数据。并发量视机器资源使用情况而定。可通过几个表测试,监控资源利用率,根据结果提高或减少并发量。常用资源监控命令有:内存和CPU监控top命令,IO监控命令iostat,网络监控命令sar等。相关案例请参见。 在资源许可的情况下,多台GDS服务器并发导入会很大程度上提高数据导入效率。相关案例请参见多数据服务器并行导入。 对于高并发的GDS导入场景,为了保持GDS和DN间的数据连接稳定,可以将GDS服务器环境和DN所在环境的TCP Keepalive检测时间增长(推荐增长至5分钟)。调整集群环境的TCP Keepalive参数会影响故障检测的响应时间。
  • 任务示例 创建一个名为reasons的目标表。 1234567 CREATE TABLE reasons( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100))DISTRIBUTE BY HASH (r_reason_sk); 在执行数据导入前,先删除相关表的索引。 假定在导入表“reasons”上的“r_reason_id”字段上存在普通索引“reasons_idx”。在执行数据导入前,请先删除相关索引。 1 DROP INDEX reasons_idx; 将数据源文件中的数据通过外表“foreign_tpcds_reasons”导入到表“reasons”中。 1 INSERT INTO reasons SELECT * FROM foreign_tpcds_reasons ; 在数据导入完成后,再重新创建索引。 1 CREATE INDEX reasons_idx ON reasons(r_reasons_id);
  • 关于COPY FROM STDIN导入数据 这种方式适合数据写入量不太大, 并发度不太高的场景。 用户可以使用以下方式通过COPY FROM STDIN语句直接向GaussDB(DWS)写入数据。 通过键盘输入向GaussDB(DWS)写入数据。 通过JDBC驱动的CopyManager接口从文件或者数据库向GaussDB(DWS)写入数据。此方法支持COPY语法中copy option的所有参数。 父主题: 使用COPY FROM STDIN导入数据
  • 操作步骤 以gds_user用户登录安装GDS的数据服务器。 请根据启动GDS的方式,选择停止GDS的方式。 若用户使用“gds”命令启动GDS,请使用以下方式停止GDS。 执行如下命令,查询GDS进程号。 ps -ef|grep gds 示例:其中GDS进程号为128954。 ps -ef|grep gdsgds_user 128954 1 0 15:03 ? 00:00:00 gds -d /input_data/ -p 192.168.0.90:5000 -l /log/gds_log.txt -Dgds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds 使用“kill”命令,停止GDS。其中128954为上一步骤中查询出的GDS进程号。 kill -9 128954
  • 背景信息 GDS的版本需与集群版本保持一致(如:GDS V100R008C00版本与DWS 1.3.X版本配套),否则可能会出现导入导出失败或导入导出进程停止响应等情况。 因此请勿使用历史版本的GDS进行导入。数据库版本升级后,请按照操作步骤中的办法下载GaussDB(DWS)软件包解压缩自带的GDS进行安装配置和启动。在导入导出开始时,GaussDB(DWS)也会进行两端的版本一致性检测,不一致时会打屏显示报错信息并终止对应操作。 GDS的版本号的查看办法为:在GDS工具的解压目录下执行如下命令。 gds -V 数据库版本的查看办法为:连接数据库后,执行如下SQL命令查看。 1 SELECT version();
  • gds.conf参数说明 表1 gds.conf配置说明 属性 说明 取值范围 name 标识名。 - ip 监听ip地址。 IP需为合法IP地址。 IP的默认值:127.0.0.1 port 监听端口号。 取值范围:1024~65535,正整数。 默认值:8098。 data_dir 数据文件目录。 - err_dir 错误日志文件目录。 默认值:数据文件目录 log_file 日志文件路径。 - host 设置允许连接到GDS的主机IP地址(参数为CIDR格式,仅支持linux系统)。 - recursive 是否递归数据文件目录。 取值范围: true:递归 。 false:不递归。 默认值:false。 daemon 是否以DAEMON(后台)模式运行。 取值范围: true:以DAEMON模式运行。 false:不以DAEMON模式运行。 默认值:false。 parallel 导入工作线程并发数目。 取值范围:0~200,正整数。 默认值:8。
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 原因 解决办法 missing data for column "r_reason_desc" 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
  • 示例 在GaussDB(DWS)数据库中,创建一个外表。参数信息如下所示: 数据格式参数访问密钥(AK和SK) 用户获取OBS访问协议对应的AK值(access_key)。 用户获取OBS访问协议对应的SK值 (secret_access_key)。 请根据用户实际获取的access_key和secret_access_key的密钥替换示例中的对应内容。 设置数据格式参数 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 是否使用加密(encrypt),默认为 'off'。 字段分隔符(delimiter)为','。 引号字符(quote)使用默认值双引号。 null(数据文件中空值的表示)为“一个没有引号的空字符串”。 header(指定导出数据文件是否包含标题行)为false,当数据文件第一行不是标题行(即表头),不需要设置。 OBS导出数据时不支持该参数为ture,使用缺省值false。 设置导入时的容错性参数 PER NODE REJECT LIMIT 'value' 为unlimited,即接受导入过程中所有数据格式错误。 LOG INTO error_table_name指定为product_info_err,将数据导入过程中出现的数据格式错误信息写入表product_info_err。 fill_missing_fields为true,即当数据加载时,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 ignore_extra_data为true,当数据加载时,若数据源文件比外表定义列数多,则忽略行尾多出来的列,不报错。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132 DROP FOREIGN TABLE product_info_ext;CREATE FOREIGN TABLE product_info_ext( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER gsmpp_server OPTIONS(LOCATION 'obs://mybucket/input_data/product_info | obs://mybucket02/input_data/product_info',FORMAT 'CSV' ,DELIMITER ',',encoding 'utf8',header 'false',ACCESS_KEY 'access_key_value_to_be_replaced',SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',fill_missing_fields 'true',ignore_extra_data 'true')READ ONLY LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited'; 返回如下信息表示创建成功: 1 CREATE FOREIGN TABLE
  • 操作步骤 根据上传数据到OBS中规划的路径,由此确定创建外表时使用的参数loaction的值。 用户获取OBS访问协议对应的AK值和SK值。获取访问密钥,请登录管理控制台,将鼠标移至右上角的用户名,单击“我的凭证”,然后在左侧导航树单击“访问密钥”。在访问密钥页面,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥。 梳理待导入数据的格式信息,确定创建外表时使用的数据格式参数的值。需要收集的主要数据源格式信息如下: format:外表中数据源文件的格式。OBS外表导入支持CSV、TEXT格式。缺省值为TEXT。 header:指定导出数据文件是否包含标题行,header只能用于CSV格式的文件中。 delimiter:指定数据文件行数据的字段分隔符,不指定则使用默认分隔符。 外表可以识别的更多参数,详细使用请参见数据格式参数 。 规划并行导入容错性,以控制导入过程中处理错误的方式。 fill_missing_fields:数据入库时,数据源文件中某行的最后一个字段缺失时,请选择是直接将字段设为Null,还是在错误表中报错提示。 ignore_extra_data:数据源文件中的字段比外表定义列数多时,请选择是忽略多出的列,还是在错误表中报错提示。 per node reject limit:本次数据导入过程中每个DN实例上允许出现的数据格式错误的数量。如果有一个DN实例上录入错误表中的错误数量超过设定值时,本次导入失败,报错退出。可以选择不做限制,也可以根据所能容忍的错误数量选择一个上限值。 compatible_illegal_chars:导入时遇到非法字符,选择如何处理。是将非法字符按照转换规则转换后入库,还是报错中止导入。 非法字符容错转换规则如下: 对于'\0',容错后转换为空格。 对于其他非法字符,容错后转换为问号。 对非法字符进行容错转换时,如遇NULL、DELIMITER、QUOTE、ESCAPE也设置成了空格或问号,GaussDB(DWS)会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。 error_table_name:用于记录数据格式错误信息的错误表表名。并行导入结束后查询此错误信息表,能够获取详细的错误信息。 更多参数,详细使用请参见容错性参数。 根据前面步骤确定的参数,创建OBS外表。外表的创建语法以及详细使用,请参考CREATE FOREIGN TABLE (OBS导入导出)。
  • 导入流程 图3 GDS并行导入流程 表1 流程说明 流程 说明 准备源数据。 准备需要导入数据库的源数据文件,并上传至数据服务器。 详细内容请参见准备源数据。 启动GDS。 在数据服务器上安装配置并启动GDS。 详细内容请参见安装配置和启动GDS。 创建外表。 创建外表用于识别数据源文件中的数据。外表中保存了数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息。 详细内容请参见创建GDS外表。 执行导入数据。 在创建好外表后,通过INSERT语句,将数据快速、高效地导入到目标表中。详细内容请参见执行导入数据。 处理错误表。 在数据并行导入发生错误时,请根据具体的错误信息进行处理,以保证导入数据的完整性。 详细内容请参见处理错误表。 优化查询效率。 导入数据后,通过ANALYZE语句生成表统计信息。ANALYZE语句会将统计结果自动存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据,以生成最有效的查询执行计划。 停止GDS 待数据导入完成后,登录每台数据服务器,分别停止GDS。 GDS的停止请参见停止GDS。
  • 概述 并行导入将存储在服务器普通文件系统中的数据导入到GaussDB(DWS)数据库中。暂时不支持将存储在HDFS文件系统上的数据导入GaussDB(DWS)。 并行导入功能通过外表设置的导入策略、导入数据格式等信息来识别数据源文件,利用多DN并行的方式,将数据从数据源文件导入到数据库中,从而提高整体导入性能。如图1所示: CN只负责任务的规划及下发,把数据导入的工作交给了DN,释放了CN的资源,使其有能力处理其他外部请求。 所有DN都参与数据导入,这样可以充分利用各设备的计算能力及网络带宽,提升导入效率。 外表灵活的OPTION设置,有利于在数据入库前对数据做预处理,例如非法字符替换、容错处理等。 图1 数据并行导入示意图 上图中所涉及的相关概念说明如下: CN(Coordinator):GaussDB(DWS)协调节点。在导入场景下,接收到应用或客户端的导入SQL指令后,负责任务的规划及下发到DN。 DN(Datanode):GaussDB(DWS)数据节点。接收CN下发的导入任务,将数据源文件中的数据通过外表写入数据库目标表中。 数据源文件:存有数据的文件。文件中保存的是待导入数据库的数据。 数据服务器:数据源文件所在的服务器称为数据服务器。基于安全考虑,建议数据服务器和GaussDB(DWS)集群处于同一内网。 外表Foreign Table:用于识别数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息。是关联数据文件与数据库实表(目标表)的对象。 目标表:数据库中的实表。数据源文件中的数据最终导入到这些表中存储,包括行存表和列存表。
  • GDS并发导入 数据量大,数据存储在多个服务器上时,在每个数据服务器上安装配置、启动GDS后,各服务器上的数据可以并行入库。如图2所示。 图2 多数据服务器并行导入 GDS进程数目不能超过DN数目。如果超过,会出现一个DN连接多个GDS进程的情形,可能会导致部分GDS异常运行。 数据存储在一台数据服务器上时,如果GaussDB(DWS)及数据服务器上的I/O资源均还有可利用空间时,可以采用GDS多线程来支持并发导入。 GDS是根据导入事务并发数来决定服务运行线程数的。也就是说即使启动GDS时设置了多线程,也并不会加速单个导入事务。未做过人为事务处理时,一条INSERT语句就是一个导入事务。 综上,多线程的使用场景如下: 多表并发导入时,采用多线程充分利用资源及提升并发导入效率。 对数据量大的某一事实表的导入进行提速。 将该事实表对应的数据拆分为多个数据文件,通过多外表同时入库的方式实现多线程并发导入。注意需确保每个外表所能读取的数据文件不重复。
  • 操作步骤 在GaussDB(DWS)数据库中,创建目标表,用于存储从OBS导入的数据。建表语法请参考CREATE TABLE。 目标表的表结构和OBS上将要导入的数据源文件的字段要保持一一对应,即字段个数、字段类型要一致。并且,目标表和创建的外表的表结构也要保持一致,字段名称可以不一样。 (可选)若导入表存在索引,在数据导入过程中,将增量更新索引信息,影响数据导入性能。建议在执行数据导入前,先删除相关表的索引。在数据导入完成后,再重新创建索引。 执行数据导入。 1 INSERT INTO [目标表名] SELECT * FROM [foreign table 表名]; 若出现以下类似信息,说明数据导入成功。请查询错误信息表,查看是否存在数据格式错误,详细操作请参见处理错误表。 1 INSERT 0 20 若出现数据加载错误,请参见处理错误表,并重新执行数据导入。
  • 背景信息 在执行数据导入前,您可以参考以下优秀实践方法进行合理的设计部署,最大化的使用系统资源,以提高数据导入性能。 OBS的数据导入性能,多数场景受限于网络的并发访问速率,因此在OBS服务器上最好部署多个桶,使用多桶并发导入,提高DN数据传输利用率。 并发导入场景,与单表导入相似,至少应保证I/O性能大于网络最大速率。 配置GUC参数“raise_errors_if_no_files”、“partition_mem_batch”和“partition_max_cache_size”,设置导入时是否区分“导入文件记录数为空”和“导入文件不存在”、导入时的缓存个数以及数据缓存区大小。 若导入表存在索引,在数据导入过程中,将增量更新索引信息,影响数据导入性能。建议在执行数据导入前,先删除相关表的索引。在数据导入完成后,再重新创建索引。
  • 示例 创建一个名为product_info的表,示例如下: 1 2 3 4 5 6 7 8 91011121314151617181920 DROP TABLE IF EXISTS product_info;CREATE TABLE product_info( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) with (orientation = column,compression=middle) DISTRIBUTE BY HASH (product_id); 执行以下命令将外表product_info_ext的数据导入到目标表product_info中: 1 INSERT INTO product_info SELECT * FROM product_info_ext;
  • 相关概念 数据源文件:存储有数据的TEXT、CSV、ORC、CARBONDATA、JSON文件。文件中保存的是待并行导入数据库的数据。 OBS:对象存储服务,是一种可存储文档、图片、影音视频等非结构化数据的云存储服务。向GaussDB(DWS)并行导入数据时,数据对象放置在OBS服务器上。 桶(Bucket):对OBS中的一个存储空间的形象称呼,是存储对象的容器。 对象存储是一种非常扁平化的存储方式,桶中存储的对象都在同一个逻辑层级,去除了文件系统中的多层级树形目录结构。 在OBS中,桶名必须是全局唯一的且不能修改,即用户创建的桶不能与自己已创建的其他桶名称相同,也不能与其他用户创建的桶名称相同。每个桶在创建时都会生成默认的桶ACL(Access Control List),桶ACL列表的每项包含了对被授权用户授予什么样的权限,如读取权限、写入权限、完全控制权限等。用户只有对桶有相应的权限,才可以对桶进行操作,如创建、删除、显示、设置桶ACL等。 一个用户最多可创建100个桶,但每个桶中存放的总数据容量和对象/文件数量没有限制。 对象:是存储在OBS中的基本数据单位。用户上传的数据以对象的形式存储在OBS的桶中。对象的属性包括名称Key,Metadata,Data。 通常,将对象等同于文件来进行管理,但是由于OBS是一种对象存储服务,并没有文件系统中的文件和文件夹概念。为了使用户更方便进行管理数据,OBS提供了一种方式模拟文件夹。通过在对象的名称中增加“/”,如tpcds1000/stock.csv,tpcds1000可以等同于文件夹,stock.csv就可以等同于文件名,而对象名称(key)仍然是tpcds1000/stock.csv、对象的内容就是stock.csv数据文件的内容。 Key:对象的名称(键),为经过UTF-8编码的长度大于0且不超过1024的字符序列,一个桶里的每个对象必须拥有唯一的对象键值。用户可使用桶名+对象名来存储和获取对应的对象。 Metadata:对象元数据,用来描述对象的信息。元数据又可分为系统元数据和用户元数据。这些元数据以键值对(Key-value)的形式随http头域一起上传到OBS系统。 系统元数据由OBS系统产生,在处理对象数据时使用。系统元数据包括:Date, Content-length, last-modify, Content-MD5等。 用户元数据由用户上传对象时指定,是用户自己对对象的一些描述信息。 Data:对象的数据内容,OBS对于数据的内容是无感知的,即认为对象内的数据为无状态的二进制数据。 数据库普通表:数据库中的普通表,数据源文件中的数据最终并行导入到这些表中存储,包括行存表、列存表。 外表:用于识别数据源文件中的数据。外表中保存了数据源文件的位置、文件格式、编码格式、数据间的分隔符等信息。
  • 导入流程图 图2 并行导入流程 表1 流程说明 流程 说明 子任务 上传数据至OBS。 在OBS服务器上规划存储路径,并上传数据文件。 详细请参见上传数据到OBS。 - 创建OBS外表。 创建外表用于识别OBS服务器上的数据源文件。在OBS外表中保存了数据源在OBS服务器上的桶名、对象名,文件格式、存放位置、编码格式、数据间的分隔符等信息。 详细请参见创建OBS外表。 - 执行导入数据。 在创建好外表后,通过INSERT语句,将数据快速、高效地导入到目标表中。 详细请参见执行导入数据。 - 处理错误表。 在数据并行导入发生错误时,请根据错误信息,处理错误表,以保证导入数据的完整性。 - 优化查询效率。 导入数据后,通过ANALYZE语句生成表统计信息。ANALYZE语句会将统计结果自动存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据,以生成最有效的查询执行计划。 -
  • 迁移数据到GaussDB(DWS) GaussDB(DWS)提供了灵活的数据入库方式,可以将多种数据源的数据导入到GaussDB(DWS)中,如图1所示。各导入方式具有不同的特点,如表1所示,用户可以根据其特点自行选择。建议用户配合数据复制服务(Data Replication Service,简称DRS)、云数据迁移(Cloud Data Migration,简称CDM)和数据湖工厂(Data Lake Factory,简称DLF)一起使用,DRS用于数据实时同步,CDM用于批量数据迁移,DLF可以对整个ETL过程进行编排调度,同时提供可视化的开发环境。 图1 数据迁移示意图 DRS、CDM、OBS、MRS为云服务。 GDS、DSC、gs_restore、gs_dump为内部工具。 表1 数据导入方式说明 数据导入方式 数据源 说明 优势 从OBS并行导入数据 OBS 支持将存储在OBS上的TXT、CSV、ORC及CARBONDATA格式的数据并行导入到GaussDB(DWS),支持导入后查询数据,也支持远程读OBS上的数据。 GaussDB(DWS)优先推荐的导入方式。 并行拉取方式,性能好,横向扩展。 使用GDS从远端服务器导入数据 Servers(即远端服务器) 使用GaussDB(DWS)提供的GDS工具,利用多DN并行的方式,将数据从远端服务器导入到GaussDB(DWS)。这种方式导入效率高,适用于大批量数据入库。 从MRS导入数据到集群 MRS(HDFS) 配置一个GaussDB(DWS)集群连接到一个MRS集群,然后将数据从MRS的HDFS中读取到GaussDB(DWS)。 并行拉取方式,性能好,横向扩展。 从GaussDB(DWS)集群导入数据到新集群 - 支持两个GaussDB(DWS)集群之间的数据互访互通。通过Foreign Table方式实现跨DWS集群的数据访问和导入。 适用于多套DWS集群之间的数据同步。 基于GDS的跨集群互联互通 - 通过GDS进行数据中转,实现多个集群之间的数据同步。 适用于多套DWS集群之间的数据同步。 使用gsql元命令\COPY导入数据 本地文件 与直接使用SQL语句COPY不同,该命令读取/写入的文件只能是gsql客户端所在机器上的本地文件。 操作简单,适用于小批量数据入库。 使用COPY FROM STDIN导入数据 其他文件或数据库 使用Java语言开发应用程序时,通过调用JDBC驱动的CopyManager接口,从文件或其他数据库向GaussDB(DWS)写入数据。 从其他数据库直接写入GaussDB(DWS)的方式,具有业务数据无需落地成文件的优势。 使用DRS将数据导入GaussDB(DWS) MySQL DDM PostgreSQL(公测) Oracle(公测) GaussDB分布式版(公测) 通过DRS实时同步功能,将数据从一个数据源拷贝到GaussDB(DWS)数据仓库,实现关键业务的数据实时流动。主要聚焦于表和数据的同步导入。 数据源丰富,操作简单。 使用CDM迁移数据到GaussDB(DWS) 数据库、NoSQL、文件系统、大数据平台 CDM提供同构/异构数据源之间批量数据迁移的功能,帮助您实现从多种类型的数据源迁移数据到GaussDB(DWS)。CDM在迁移数据到GaussDB(DWS)时,采用的是Copy方式和GDS并行导入方式。 数据源丰富,操作简单。 使用DSC工具迁移SQL脚本 数据库、NoSQL、文件系统、大数据平台 请参考第三方ETL工具的相关文档。 GaussDB(DWS)提供了DSC工具,可以将Teradata/Oracle脚本迁移到GaussDB(DWS)。 通过OBS中转,数据源丰富,数据转换能力强。 使用gs_dump和gs_dumpall命令导出元数据 纯文本格式 自定义归档格式 目录归档格式 tar归档格式 gs_dump支持导出单个数据库或其内的对象,而gs_dumpall支持导出集群中所有数据库或各库的公共全局对象。 通过导入工具将导出的元数据信息导入至需要的数据库,可以完成数据库信息的迁移。 适用于元数据迁移。 使用gs_restore导入数据 sql/tmp/tar文件格式 在数据库迁移场景下,支持使用gs_restore工具将事先使用gs_dump工具导出的文件格式,重新导入GaussDB(DWS)集群,实现表定义、数据库对象定义等元数据的导入。导入数据主要包括以下内容: 所有数据库对象定义。 单个数据库对象定义。 单个schema定义。 单张表定义。 父主题: 数据迁移
  • 创建访问密钥(AK和SK) 在创建访问密钥前,请确保登录控制台的帐号已通过实名认证。 通过管理控制台创建访问密钥(AK和SK)操作步骤如下: 登录GaussDB(DWS) 管理控制台。 单击右上角用户名,在下拉菜单中单击“我的凭证”。 在左侧导航树单击“访问密钥”。 如果在访问密钥列表中已经有访问密钥了,可以直接使用现有的访问密钥。但是,在访问密钥列表中只能查看到访问密钥ID(即Access Key ID),只有在新增访问密钥时,用户才可以下载到含有Access Key ID和Secret Access Key的密钥文件。如果您没有该密钥文件,可以单击“新增访问密钥”重新创建。 每个用户最多可创建两个有效的访问密钥,如果当前已存在2个访问密钥,只能先删除现有的访问密钥,然后再重新创建。删除时,需要输入当前用户的登录密码、邮箱或手机短信的验证码,验证通过才能成功删除。 为了帐号安全性,建议您定期更换并妥善保存访问密钥。 单击“新增访问密钥”。 在弹出的对话框中,输入登录密码和对应验证码,然后单击“确定”。 用户如果未绑定邮箱和手机,则只需输入登录密码。 用户如果同时绑定了邮箱和手机,可以选择其中一种方式进行验证。 在弹出的“下载确认”提示框中,单击“确定”后,密钥会直接保存到浏览器默认的下载文件夹中。 为防止访问密钥泄露,建议您将其保存到安全的位置。 如果用户在此提示框中单击“取消”,则不会下载密钥,后续也将无法重新下载。如果需要使用访问密钥,可以重新创建新的访问密钥。 打开下载下来的“credentials.csv”文件即可获取到访问密钥(AK和SK)。
  • 创建外表 当完成创建外部服务器后,在GaussDB(DWS)数据库中创建一个HDFS只写外表,用来访问存储在HDFS上的数据。此外表是只写的,只能用于导出操作。 创建外表的语法格式如下,详细的描述请参见CREATE FOREIGN TABLE (SQL on Hadoop or OBS)。 1 2 3 4 5 6 7 8 91011 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name [ { [CONSTRAINT constraint_name] NULL | [CONSTRAINT constraint_name] NOT NULL | column_constraint [...]} ] | table_constraint [, ...]} [, ...] ] ) SERVER dfs_server OPTIONS ( { option_name ' value ' } [, ...] ) [ {WRITE ONLY }] DISTRIBUTE BY {ROUNDROBIN | REPLICATION} [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ; 例如,创建一个名为"product_info_ext_obs"的外表,对语法中的参数按如下描述进行设置: table_name 外表的表名。 表字段定义 column_name:外表中的字段名。 type_name:字段的数据类型。 多个字段用“,”隔开。 SERVER dfs_server 外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器连接OBS/HDFS读取数据。 此处应参考创建外部服务器中创建的外部服务器名称填写。 OPTIONS参数 用于指定外表数据的各类参数,关键参数如下所示。 “format”:表示导出的数据文件格式,支持“orc”格式。 “foldername”:外表中数据源文件目录,即表数据目录在HDFS文件系统上对应的文件目录。此选项对WRITE ONLY外表为必选项,对READ ONLY外表为可选项。 “encoding”:外表中数据源文件的编码格式名称,缺省为utf8。 filesize 指定WRITE ONLY外表的文件大小。此选项为可选项,不指定该选项默认分布式文件系统配置中文件大小的配置值。此语法仅对WRITE ONLY的外表有效。 取值范围:[1, 1024]的整数。 filesize参数只对ORC格式的WRITE ONLY的HDFS外表有效。 compression 指定ORC格式文件的压缩方式,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围:zlib,snappy,lz4。缺省值为snappy。 version 指定ORC格式的版本号,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围:目前仅支持0.12。缺省值为0.12。 dataencoding 在数据库编码与数据表的数据编码不一致时,该参数用于指定导出数据表的数据编码。比如数据库编码为Latin-1,而导出的数据表中的数据为UTF-8编码。此选项为可选项,如果不指定该选项,默认采用数据库编码。此语法仅对HDFS的WRITE ONLY外表有效。 取值范围:该数据库编码支持转换的数据编码。 dataencoding参数只对ORC格式的WRITE ONLY的HDFS外表有效。 语法中的其他参数 其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中不需要设置。详细的描述请参见CREATE FOREIGN TABLE (SQL on Hadoop or OBS)。 根据以上信息,创建外表命令如下所示: 1 2 3 4 5 6 7 8 9101112131415161718192021222324 DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;---建立不包含分区列的HDFS外表,表关联的外部服务器为hdfs_server,表对应的HDFS服务上的文件格式为‘orc’,HDFS上的数据存储路径为'/user/hive/warehouse/product_info_orc/'。CREATE FOREIGN TABLE product_info_ext_obs( product_price integer , product_id char(30) , product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER obs_server OPTIONS (format 'orc', foldername '/user/hive/warehouse/product_info_orc/', compression 'snappy', version '0.12') Write Only; 父主题: 导出ORC数据到MRS
  • ODBC接口参考 ODBC接口是一套提供给用户的API函数,本节将对部分常用接口做具体描述,若涉及其他接口可参考msdn(网址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx)中ODBC Programmer's Reference项的相关内容。 SQLAllocEnv SQLAllocConnect SQLAllocHandle SQLAllocStmt SQLBindCol SQLBindParameter SQLColAttribute SQLConnect SQLDisconnect SQLExecDirect SQLExecute SQLFetch SQLFreeStmt SQLFreeConnect SQLFreeHandle SQLFreeEnv SQLPrepare SQLGetData SQLGetDiagRec SQLSetConnectAttr SQLSetEnvAttr SQLSetStmtAttr 父主题: 基于ODBC开发
  • java.sql.DatabaseMetaData java.sql.DatabaseMetaData是数据库对象定义接口。 表1 对java.sql.DatabaseMetaData的支持情况 方法名 返回值类型 支持JDBC 4 getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) ResultSet Yes getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) ResultSet Yes getTableTypes() ResultSet Yes getUserName() String Yes isReadOnly() boolean Yes nullsAreSortedHigh() boolean Yes nullsAreSortedLow() boolean Yes nullsAreSortedAtStart() boolean Yes nullsAreSortedAtEnd() boolean Yes getDatabaseProductName() String Yes getDatabaseProductVersion() String Yes getDriverName() String Yes getDriverVersion() String Yes getDriverMajorVersion() int Yes getDriverMinorVersion() int Yes usesLocalFiles() boolean Yes usesLocalFilePerTable() boolean Yes supportsMixedCaseIdentifiers() boolean Yes storesUpperCaseIdentifiers() boolean Yes storesLowerCaseIdentifiers() boolean Yes supportsMixedCaseQuotedIdentifiers() boolean Yes storesUpperCaseQuotedIdentifiers() boolean Yes storesLowerCaseQuotedIdentifiers() boolean Yes storesMixedCaseQuotedIdentifiers() boolean Yes supportsAlterTableWithAddColumn() boolean Yes supportsAlterTableWithDropColumn() boolean Yes supportsColumnAliasing() boolean Yes nullPlusNonNullIsNull() boolean Yes supportsConvert() boolean Yes supportsConvert(int fromType, int toType) boolean Yes supportsTableCorrelationNames() boolean Yes supportsDifferentTableCorrelationNames() boolean Yes supportsExpressionsInOrderBy() boolean Yes supportsOrderByUnrelated() boolean Yes supportsGroupBy() boolean Yes supportsGroupByUnrelated() boolean Yes supportsGroupByBeyondSelect() boolean Yes supportsLikeEscapeClause() boolean Yes supportsMultipleResultSets() boolean Yes supportsMultipleTransactions() boolean Yes supportsNonNullableColumns() boolean Yes supportsMinimumSQLGrammar() boolean Yes supportsCoreSQLGrammar() boolean Yes supportsExtendedSQLGrammar() boolean Yes supportsANSI92EntryLevelSQL() boolean Yes supportsANSI92IntermediateSQL() boolean Yes supportsANSI92FullSQL() boolean Yes supportsIntegrityEnhancementFacility() boolean Yes supportsOuterJoins() boolean Yes supportsFullOuterJoins() boolean Yes supportsLimitedOuterJoins() boolean Yes isCatalogAtStart() boolean Yes supportsSchemasInDataManipulation() boolean Yes supportsSavepoints() boolean Yes supportsResultSetHoldability(int holdability) boolean Yes getResultSetHoldability() int Yes getDatabaseMajorVersion() int Yes getDatabaseMinorVersion() int Yes getJDBCMajorVersion() int Yes getJDBCMinorVersion() int Yes 父主题: JDBC接口参考
  • 常用方法 表1 CopyManager常用方法 返回值 方法 描述 throws CopyIn copyIn(String sql) - SQLException long copyIn(String sql, InputStream from) 使用COPY FROM STDIN从InputStream中快速向数据库中的表加载数据。 SQLException,IOException long copyIn(String sql, InputStream from, int bufferSize) 使用COPY FROM STDIN从InputStream中快速向数据库中的表加载数据。 SQLException,IOException long copyIn(String sql, Reader from) 使用COPY FROM STDIN从Reader中快速向数据库中的表加载数据。 SQLException,IOException long copyIn(String sql, Reader from, int bufferSize) 使用COPY FROM STDIN从Reader中快速向数据库中的表加载数据。 SQLException,IOException CopyOut copyOut(String sql) - SQLException long copyOut(String sql, OutputStream to) 将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。 SQLException,IOException long copyOut(String sql, Writer to) 将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。 SQLException,IOException
  • java.sql.ResultSet java.sql.ResultSet是执行结果集接口。 表1 对java.sql.ResultSet的支持情况 方法名 返回值类型 支持JDBC 4 findColumn(String columnLabel) int Yes getBigDecimal(int columnIndex) BigDecimal Yes getBigDecimal(String columnLabel) BigDecimal Yes getBoolean(int columnIndex) boolean Yes getBoolean(String columnLabel) boolean Yes getByte(int columnIndex) byte Yes getBytes(int columnIndex) byte[] Yes getByte(String columnLabel) byte Yes getBytes(String columnLabel) byte[] Yes getDate(int columnIndex) Date Yes getDate(String columnLabel) Date Yes getDouble(int columnIndex) double Yes getDouble(String columnLabel) double Yes getFloat(int columnIndex) float Yes getFloat(String columnLabel) float Yes getInt(int columnIndex) int Yes getInt(String columnLabel) int Yes getLong(int columnIndex) long Yes getLong(String columnLabel) long Yes getShort(int columnIndex) short Yes getShort(String columnLabel) short Yes getString(int columnIndex) String Yes getString(String columnLabel) String Yes getTime(int columnIndex) Time Yes getTime(String columnLabel) Time Yes getTimestamp(int columnIndex) Timestamp Yes getTimestamp(String columnLabel) Timestamp Yes isAfterLast() boolean Yes isBeforeFirst() boolean Yes isFirst() boolean Yes next() boolean Yes 一个Statement不能有多个处于“open”状态的ResultSet。 用于遍历结果集(ResultSet)的游标(Cursor)在被提交后不能保持“open”的状态。 父主题: JDBC接口参考
  • javax.sql.DataSource javax.sql.DataSource是数据源接口。 表1 对javax.sql.DataSource接口的支持情况 方法名 返回值类型 支持JDBC 4 getConneciton() Connection Yes getConnection(String username,String password) Connection Yes getLoginTimeout() int Yes getLogWriter() PrintWriter Yes setLoginTimeout(int seconds) void Yes setLogWriter(PrintWriter out) void Yes 父主题: JDBC接口参考
共100000条