GBase 8a JDBC接口获取加载任务信息示例
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产品手册》 加载错误数据与溯源信息检索 相关章节内容
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526