Inceptor/ArgoDB开发者指南系列之_基于JDBC开发(上)

友情链接:


概览

JDBC( Java 数据库连接)是一种用于执行 SQL 语句的 Java API,提供查询、更新数据库中数据的方法,工作流程如下:

image.png

JDBC 工作流程

接下来将为您提供详尽的教程,帮助您快速开发 Java 程序来连接和读写Inceptor/ArgoDB 数据库。

如果您是首次尝试开发,您可以阅读下方开发流程了解基本开发步骤,然后基于示例代码简单修改即可。

如果您已经熟悉开发流程:您可以阅读下一篇文章 JDBC 接口参考,快速查找相关接口的使用说明。


下载 JDBC 驱动

JDBC 或 ODBC 驱动程序用于连接 Transwarp Inceptor/ ArgoDB 数据库,在开发应用程序前,您需要登录 Transwarp Manager 平台下载相关驱动程序。

操作步骤

  1. 登录 Transwarp Manager 平台。
  2. 在集群页面的 Inceptor/ Transwarp ArgoDB 区域框中,找到并单击运行中的 Quark 组件。
  3. 单击页面右上角的 … 图标,然后选择下载 JDBC 或 ODBC 驱动。

image.png

4. 在弹出的面板中,单击下载(推荐下载 All-in-one 包)。


或者也可以点击社区驱动下载页面下载对应驱动:驱动下载页面


常用 API 介绍

JDBC API 提供来自 Java 编程语言的通用数据访问,主要位于 java.sql 包中,定义了访问数据库的接口和类,常用的 API 如下:

  • DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
  • Driver:驱动程序,负责将自身加载到 DriverManager 中去,并处理相应的请求并返回相应的数据库连接(Connection)。
  • Connection:数据库连接,负责进行与数据库间的通讯,SQL 执行以及事务处理都是在某个特定 Connection 环境中进行的。可以产生用以执行 SQL 的 Statement。
  • Statement:用以执行 SQL 查询和更新(针对静态 SQL 语句和单次执行)。
  • PreparedStatement:用以执行包含动态参数的 SQL 查询和更新(在服务器端编译,允许重复执行以提高效率)。
  • CallableStatement:用以调用数据库中的存储过程。
  • SQLException:代表在数据库连接的创建和关闭和 SQL 语句的执行过程中发生了例外情况(即错误)。


开发流程

Inceptor/ArgoDB 支持完整的 SQL 标准语法,可兼容 Oracle、IBM DB2、Teradata 方言,本章节中,我们将介绍如何开发 Java 应用程序对 Inceptor/ArgoDB 数据进行操作,通用开发流程如下:


在开发 Java 应用程序前,请确保 JDK 版本为 1.8 及以上。

image.png

JDBC 开发流程

接下来,我们将介绍各步骤的详细操作及示例代码供您参考:

1. 在项目中加载您下载的驱动包,以 IntelliJ IDEA 开发工具为例,流程如下:

  • 在 IntelliJ IDEA 顶部,选择 File > Project Structure。
  • 在弹出的对话框单击 Modules 页签,然后单击右侧的 Dependencies 页签。
  • 单击 + > JARs or Directories…,然后选择您下载的驱动以完成加载。

image.png

2. 开始编写项目中的 Java 代码,首先我们在代码中加载 jar 包 和 JDBC 驱动。

// 导入 jar 包
import java.sql.*;
// 加载 JDBC 驱动
Class.forName("org.apache.hive.jdbc.HiveDriver");

3. 在 DriverManager 中,使用 DriverManager.getConnection() 方法获取数据库连接(Connection)。


下述示例代码以连接免认证的 Inceptor/ArgoDB 数据库为例,如数据库开启了认证,请参考示例代码章节。
String jdbcURL = "jdbc:transwarp2://<host_ip>:<port>/<database_name>;<JDBC_Conf>?<Inceptor/ArgoDB_Conf>";
Connection conn = DriverManager.getConnection(jdbcURL);

a) <host_ip>:数据库的连接地址,即 Quark 组件的服务地址,您可以登录 Transwarp Manager 平台,找到 Quark 组件并获取其服务地址。

b) <port>:数据库服务端口,默认为 10000。

c) <database_name>:要连接的数据库名。

d) <JDBC_Conf>:JDBC 连接参数,多个参数间通过英文分号(;)分隔,常见参数如下:

  • limitSelect:限制 select 的结果集的行数,例如:jdbc:transwarp2://localhost:10000/default;limitSelect=0
  • fetchSize:修改数据库交互时,每次提取出来的记录行总数,例如:jdbc:transwarp2://localhost:10000/default;fetchSize=2000
  • autoReconnect:连接出错后自动重连,例如:jdbc:transwarp2://localhost:10000/default;autoReconnect=true

e) <Inceptor/ArgoDB_Conf>:Inceptor/ArgoDB 连接参数,多个参数间通过英文分号(;)分隔,常用参数为 ngmr.execute.mode,即设置 Inceptor/ArgoDB 的执行模式。

  • 例如设置为 local 模式,适用于低延时、高并发、参与计算数据量少的场景:jdbc:transwarp2://localhost:10000/default;limitSelect=1?ngmr.execute.mode=local

4. 提交 SQL 语句至数据库执行,可使用 Statement 或 PreparedStatement 构建。

  • Statement 构建方式
Statement stmt = conn.createStatement();
stmt.executeUpdate( "insert into table_test values(a,a)" );
stmt.executeUpdate( "delete from table_test where col1=a" );
stmt.executeQuery( "select * from table_test" );
stmt.execute( "begin transaction" );
  • PreparedStatement 构建方式
ps = conn.prepareStatement( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i = ? AND j = ?" );
ps.setString(1, "Poor Yorick");
ps.setInt(2, 8008);
rs = ps.executeQuery();

5. (可选)通过 JDBC 执行事务。

默认情况下,处于自动提交模式,即每执行一条 SQL 都是作为事务自动执行的,您也可以使用 begin transaction,可以在一个事务中执行多条语句,事务以 commit 结束。

stmt.execute("begin transaction");
stmt.executeUpdate(SQL 1);
stmt.executeUpdate(SQL 2);
stmt.executeUpdate(SQL 3);
stmt.execute("commit");

6. 使用 ResultSet.getXXX() 方法获取数据结果。

int numColumns = rs.getMetaData().getColumnCount();
while ( rs.next() ) {
for ( int i = 1 ; i <= numColumns ; i++ ) {
System.out.println( "COLUMN " + i + " = " + rs.getObject(i) );
}
}

7. 关闭所有的数据库资源。

rs.close();
stmt.close();
conn.close();


异常处理

异常处理允许我们以受控的方式处理异常情况,而不是直接退出程序。例如数据库操作失败,JDBC 将抛出一个 SQLException,此类异常很少能够恢复,此时需要尽可能详细地打印异常日志,将 SQLException 翻译成应用程序领域相关的异常(非强制处理异常),然后回滚数据库并通知用户。

示例代码

为帮助您更好地上手 Inceptor 相关应用程序的开发,下文提供了不同验证模式下,与 Inceptor 进行交互的相关代码功能参考。

  • 免认证模式
  • Kerberos 认证模式
  • LDAP 认证模式

与免认证的 Inceptor 交互

当 Inceptor 未开启认证时,您可以参考下述代码连接并操作 Inceptor,相关说明请参考代码中的注释。

package demo;
import java.sql.*;
public class JDBCExample {

  // 驱动程序
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";

  public static void main(String[] args) throws SQLException {
    try {
      Class.forName(driverName);
      // 加载驱动
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      System.exit(1);
    }
    // 本示例连接至 default 数据库,您也可以指定要连接的数据库
    String jdbcURL = "jdbc:transwarp2://172.18.130.13:10000/default";
    Connection conn = DriverManager.getConnection(jdbcURL);
            // 执行查询并获取结果
    Statement  stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select * from table_jdbc");
    ResultSetMetaData rsmd = rs.getMetaData();
    int size = rsmd.getColumnCount();
    while(rs.next()) {
      StringBuffer value = new StringBuffer();
      for(int i = 0; i < size; i++) {
        value.append(rs.getString(i+1)).append("\t");
      }
    // 获取输出结果并关闭连接
    System.out.println(value.toString());
    }
    rs.close();
    stmt.close();
    conn.close();
  }
}

与启用 Kerberos 认证的 Inceptor 交互

当 Inceptor 启用了 Kerberos 认证时,您可以参考下述代码连接并操作 Inceptor。

import java.sql.*;

public class JDBCExample {
  // 驱动程序
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";

  public static void main(String[] args) throws SQLException {
    try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      System.exit(1);
    }

    // 建立连接
    String jdbcURL = "jdbc:transwarp2://localhost:10000/default;principal=hive/node@TDH;"+ 
        "authentication=kerberos;"+
        "kuser=user_principal;"+ 
        "keytab=keytab_path;"+ 
        "krb5conf=krb5.conf_path"; 
    Connection conn = DriverManager.getConnection(jdbcURL);
    // 执行查询并获取结果
    Statement  stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select c1, c2 from table1");
    ResultSetMetaData rsmd = rs.getMetaData();
    int size = rsmd.getColumnCount();
    while(rs.next()) {
      StringBuffer value = new StringBuffer();
      for(int i = 0; i < size; i++) {
        value.append(rs.getString(i+1)).append("\t");
      }
    // 获取输出结果并关闭连接
    System.out.println(value.toString());
    }
    rs.close();
    stmt.close();
    conn.close();
  }
}

①  连接至开启 Kerberos 认证的 Inceptor 的 JDBC 连接串,格式为 jdbc:transwarp2://<host_ip>:10000/<database_name>;principal=<username>/node@TDH;

  • <host_ip>:数据库的连接地址。
  • <database_name>:连接的数据库名。
  • <username>:Kerberos 中 Principal 的用户名,默认为 hive。

②  kuser:将值设置为 Inceptor server的用户的 principal。

③  keytab_path:将值设置为 user_principal 对应 keytab 文件的绝对路径 。

目前尚不支持在应用程序中使用 principal + 密码的认证方式。

④  krb5.conf_path:将值设置为 Kerberos 配置文件 krb5.conf 的绝对路径 。

与启用 LDAP 认证的 Inceptor 交互

当 Inceptor 启用了 LDAP 认证时,您可以参考下述代码连接并操作 Inceptor。

import java.sql.*;
public class JDBCExample {

  // 驱动程序
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";

  public static void main(String[] args) throws SQLException {
    try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      System.exit(1);
    }

    // 连接数据库,本示例连接至 default 数据库,您也可以指定要连接的数据库
    String jdbcURL = "jdbc:transwarp2://localhost:10000/default";
    // 访问 Inceptor 的用户名。
    String user = "user";
    // 用户名对应的密码。
    String password = "password";
    Connection conn = DriverManager.getConnection(jdbcURL, user, password);
    // 执行查询并获取结果
    Statement  stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select c1, c2 from table1");
    ResultSetMetaData rsmd = rs.getMetaData();
    int size = rsmd.getColumnCount();
    while(rs.next()) {
      StringBuffer value = new StringBuffer();
      for(int i = 0; i < size; i++) {
        value.append(rs.getString(i+1)).append("\t");
      }
    // 获取输出结果并关闭连接
    System.out.println(value.toString());
    }
    rs.close();
    stmt.close();
    conn.close();
  }
}


JDBC 接口参考

由于篇幅原因,有关 JDBC 4 支持的接口及返回类型功能参考,可参考下一篇:JDBC 接口参考





如果上述内容对您有提供帮助,欢迎多多点赞支持~😎

点赞.png下箭头,指向下箭头.png

评论
登录后可评论
发布者
星小环分享号
文章
180
问答
205
关注者
27
banner
关注星环科技
获取最新活动资讯

加入TDH社区版技术交流群

获取更多技术支持 ->

扫描二维码,立即加入