GBase 8a
其他
文章

GBase 8a JDBC接口获取加载任务信息示例

发表于2024-03-27 13:22:39188次浏览1个评论

1.GBase 8a JDBC API获取加载任务信息接口说明

    JDBC接口提供用于获取加载任务ID号,加载数据跳过行数的功能。由于标准接口并不包含该方法定义,上述接口实现类在JDBC API jar包中的com.gbase.jdbc.StatementImpl中实现,使用时用户需要将标准的Statement对象转化为StatementImpl类型方可使用。

     具体接口方法为:

     getLoadTaskID()
     getSkippedLines()

2.查询存在SKIP条数的Load Task查询语句

    由于加载任务在max_bad_record为默认值0时,加载出现跳出数据并不产生加载任务报错异常。业务上往往需要获取Skip条数信息后判断加载任务是否存在异常,并且对异常任务进行后续逻辑处理。在处理中往往需要获取加载跳数异常的原因。GBase 8a中提供了SQL接口的查询语句帮助用户对跳出的错误数据进行溯源,具体查询语句格式为:

    SHOW [ GCLUSTER ] LOAD LOGS task_id LIMIT {[offset,] row_count};

    因此在进行错误数据后续处理的逻辑中,如程序中记录错误数据的报错原因,具体列号等,可以先通过JDBC提供的getLoadTaskID()方法获取本次加载任务的任务号,在通过上面溯源查询语句来获取具体错误原因。

    将以上两部分代码进行整合即可满足一些业务上通过JDBC接口发送load任务,同时获取任务执行结果和错误数据原因的逻辑。

3.测试代码样例

    将上述功能简单编写一个代码样例可供参考,具体代码内容如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import com.gbase.jdbc.StatementImpl;
import com.gbase.jdbc.Driver;

public class test {
	public static void main(String[] args) {
		test connectionSimple = new test();
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		ResultSetMetaData rsmd = null;
		try {
			conn = DriverManager.getConnection("jdbc:gbase://192.168.56.161:5258/test?user=root&password=");
			String loadSql = "load data infile 'file://192.168.56.161/home/gbase/test_jdbc_load1.tbl' into table test_jdbc_load fields terminated by ','";
			StatementImpl stm = (StatementImpl) conn.createStatement();
			stm.executeUpdate(loadSql);
			long skippedLines = stm.getSkippedLines();
			long taskID = stm.getLoadTaskID();

			System.out.print("=======LOAD TASK INFO=======\n");
			System.out.print("taskID=" + taskID + "\n");
			System.out.print("skippedLines=" + skippedLines + "\n");
			
			rs = stm.executeQuery("show load logs " + Long.toString(taskID) + " limit 1");
			rsmd = rs.getMetaData();
			int rsColumnCount = rsmd.getColumnCount();

			System.out.print("=======SKIP TASK MESSAGE=======\n");
			while (rs.next()) {
				for (int i = 0; i < rsColumnCount; i++) {
					System.out.print(rsmd.getColumnName(i+1).concat("="));
					System.out.print(rs.getObject(i+1) + "\n");
				}
			}
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		} finally {
			try {
				conn.close();
			} catch (NullPointerException e) {
			} catch (Exception e) {
				conn = null;
			}
		}
	}
}

    样例代码执行环境:

  • 操作系统:Kylin Linux Advanced Server release V10 SP1
  • JDK环境:
    • java-1.8.0-openjdk-1.8.0.242.b08-1.h5.ky10.x86_64
    • java-1.8.0-openjdk-devel-1.8.0.242.b08-1.h5.ky10.x86_64
    • java-1.8.0-openjdk-headless-1.8.0.242.b08-1.h5.ky10.x86_64
  • JDBC驱动包版本:gbase-connector-java-9.5.3.0-build1-bin.jar

代码编译指令:

将JDBC驱动包与java代码放在同一目录下:

javac -cp ./gbase-connector-java-9.5.3.0-build1-bin.jar test.java

代码执行指令:

java -cp .:./gbase-connector-java-9.5.3.0-build1-bin.jar test

测试方法:

在数据库内建一张表,表结构如下:

CREATE TABLE "test_jdbc_load" (
 "a" int(11) DEFAULT NULL,
 "b" varchar(20) DEFAULT NULL

手工造平面文件,内容如下:

test_jdbc_load1.tbl

111,aaa,aabbaa
222,bbb,ffggff

数据文件中字段数多余表列数,制造跳数异常,执行上述java代码,打屏信息如下:

4.参考文档及注意事项

注意:

1)支持getLoadTaskID()和getSkippedLines()方法的jdbc驱动包要求gbase-connector-java-8.3.81.53-build54.1版本以上;

2)GBase 8a在8.6.1.1版本以上才支持SQL接口的load data infile语法,因此通过java jdbc接口下发load指令要求集群版本高于8.6.1.1

参考文档:

getLoadTaskID()、getSkippedLines()接口使用方法示例及说明见《GBase 8a程序员手册JDBC篇》 GBase JDBC获取加载任务信息 相关章节内容

下发查询指令获取具体load task溯源信息方法,具体内容参考《GBase 8a MPP Cluster产品手册》 加载错误数据与溯源信息检索 相关章节内容

 

评论

登录后才可以发表评论
崔哥发表于 5个月前
乔木生云气。访中兴、英雄陈迹,暗追前事。战舰东风慳借便,梦断神州故里。旋小筑、吴宫闲地。华表月明归夜鹤,叹当时、花竹今如此。枝上露,溅清泪。遨头小簇行春队。步苍苔、寻幽别坞,问梅开未。重唱梅边新度曲,催发寒梢冻蕊。此心与、东君同意。后不如今今非昔,两无言、相对沧浪水。怀此恨,寄残醉。