南大通用GBase 8a MPP Cluster开发接口之JDBC篇

原文链接:https://www.gbase.cn/community/post/4300
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

1 概述 

1.1 GBase JDBC 介绍 

GBase 8a 数据库通过提供JDBC驱动为使用JAVA程序语言的应用程序提供访问GBase 数据库的接口,叫做 GBase JDBC。
GBase JDBC 是一种兼容 JDBC-3.0、4.0 "类型 4"的驱动,这意味着它是符合JDBC 3.0、4.0版本规范的一种纯Java程序,并能使用GBase协议直接和GBase服务器通信。

1.2GBase JDBC 版本 

GBase JDBC 8.3.81.51 提供了如下新特性:

1) 自动注册驱动(需要 jdk1.6 的)
2) National Character Set Conversion Support

GBase JDBC 8.3.81.53 提供了如下新特性:

1) 针对 GBase 8a 集群提供高可用性(IP 自动路由)功能;

GBase JDBC 8.3.81.53_build51.1 提供了如下新特性:
1) 针对 GBase 8a 集群提供高可用性负载均衡功能;

1.3GBase JDBC 与 jdk 的兼容性 

GBase JDBC 与 jdk 的兼容性如下表格所示:

GBase JDBC 版本jre 版本 
8.3.81.53_build51.11.5 及以上版本
8.3.81.531.5 及以上版本
8.3.81.511.5 及以上版本
8.2.011.4 及以上版本

2 GBase JDBC 基本概念

2.1 GBase JDBC 主要类与接口 

GBase JDBC 由具有建立和管理与 GBase 数据库连接功能、执行 SQL 语句功能和对结果集进行储存和管理功能的若干功能类组成。
下面是 Gbase JDBC 涉及的主要类:

  • Driver 类 (com.gbase.jdbc.Driver)

当注册驱动的时候或配置软件以使用 GBase JDBC 的时候,应该使用这个类名。在使用 GBase JDBC 8.3.81.x 版本的驱动(jre1.6 及以上版本)时可以省去注册驱动,由 java 虚拟机自动完整驱动注册。
示例:Class.forName("com.gbase.jdbc.Driver");

  • DriverManager 类(java.sql.DriverManager)

跟踪可用的驱动程序,在数据库与相应的驱动程序之间建立连接。在应用服务器外使用 JDBC 时,DriverManager 类管理连接的确立。需要告诉 DriverManager 应该与哪个 JDBC 驱动进行连接,最简单的方法就是使用实现了接口 java.sql.Driver 的类的 Class.forName()方法。在 GBase JDBC 中,这个类的名字叫做 com.gbase.jdbc.Driver。用这种方法,就可以在连接一个数据库时使用一个外部配置文件来给驱动提供类名和驱动参数。

  •  Connection 接口(com.gbase.jdbc. Connection)

与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
示例:Connection con=DriverManager.getConnection("jdbc:gbase://host:port/dbname ", "user", "password");

  • Statement 接口(com.gbase.jdbc.Statement)

用于执行 SQL 语句并返回结果。

  • ResultSet 接口(java.sql.ResultSet)

通常由执行 SQL 语句来产生。示例:
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(select c_custkey from customer);

2.2 使用字符集和 Unicode 

JDBC 驱动发送给服务器的所有字符串都自动地从本地的 Java Unicode 转换到客户端的字符编码,包括所有通过 Statement.execute() 、Statement.executeUpdate() 、Statement.executeQuery()发送的查询以及所有 PreparedStatement 和 CallableStatement 参数,但使用 setBytes() 、setBinaryStream() 、setAsiiStream() 、setUnicodeStream() 和 setBlob()的参数集不包含在内。

GBase 8a 使用 JDBC 的 ResultSets 在客户端与服务器之间传输数据支持单一编码形式以及任意数目的编码形式。

在连接时会自动地检测客户端与服务器之间的字符编码。通过配置变量,驱动使用的编码指定在服务器上,这个变量在 GBase 8a server 中是“character_set_server ”。如果不想客户端自动识别编码,可以在用来连接服务器的 URL 中使用characterEncoding 属性,使用该属性的同时必须使用设置“useUnicode”的值为 true。

当在客户端指定字符编码时,应该使用 Java-style 名字。下表列出了对于GBase 字符集的 Java-style 名字:

GBase Server 字符集名Java 字符集名称
gbkGBK
utf8UTF-8



警告:在 GBase JDBC 中,不要执行“set names”来设置字符集,因为驱动不会发现字符集已经改变,而是会继续使用在初始化连接设置时使用的字符集。
为了允许从客户端发来的各种字符集,应当使用“UTF-8”编码,或者把“UTF-8”配置成缺省的服务器字符集,或者通过 characterEncoding 属性配置JDBC 驱动使用“UTF-8”。

3 GBase JDBC 高可用特性

GBase JDBC 高可用特性是针对 GBase 数据库集群提供客户端高可用及负载均衡相关功能功能。

3.1GBase JDBC 集群高可用性

在通过 GBaseJDBC 访问 GBase 集群时,如果集群当前节点不可用,希望直接连接到集群中一个可用的节点上时,我们可以使用 GBase JDBC 集群高可用性功能(该功能需要 GBase JDBC8.3.81.53 及以上版本)。

GBase JDBC 集群高可用性是接口针对 GBase 集群做的在接口层面的高可用性处理(IP 自动路由)。

高可用性适用于扁平结构的 GBase 集群,在创建 JDBC 连接时,如果当前 IP的集群节点不可用,接口会根据相关参数信息把连接数据库请求自动路由到集群其他可用的节点。

假设有如下场景:
1、部署有一个 GBase 集群,三个节点 IP 如下:
192.168.1.56;
192.168.1.57;
192.168.1.58;

创建数据库连接时设置 hostList、hostList 参数。
String url = "jdbc:gbase://192.168.1.56:5258/test?user=root&password=root &failoverEnable=true&hostList=192.168.1.57,192.168.1.58";
……
DriverManager.getConnection(dbUrl);
……
即可实现接口层面的高可用性(IP 自动路由)功能。

3.2 GBase JDBC 集群高可用负载均衡 

如果我们希望把数据库连接请求平均分布到各个节点的上话,我们可以使用 GBase JDBC 集群高可用负载均衡功能(该功能需要 GBase JDBC 8.3.81.53_build51.1 及以上版本。)。

高可用负载均衡是 GBaseJDBC 针对集群开发的接口层面的客户端负载均衡功能。该功能能把客户发送来的数据库连接请求分发到各个节点,在GBaseJDBC8.3.81.53_built51.1 版本中负载均衡策略为轮询。

假设有如下场景:
1、部署有一个 GBase 集群,三个节点 IP 如下:
192.168.1.56;
192.168.1.57;
192.168.1.58;
如果我们希望把数据库连接请求均摊到三个节点时,创建连接时设置failoverEnable、hostList、gclusterId 三个参数即可。连接串写法如下:
String URL = “jdbc:gbase://192.168.1.56:5258/test?user=gbase&password=gbase20110531&failoverEnable=true&hostList=192.168.1.57,192.168.1.58&gclusterId=gcl1”

其中 gclusterId 参数取值范围:必须以 a-z 任意字符开头的可以包含 a-z、0-9 所有字符长度为最大为 20 的字符串。
……
for (int I = 0; i < 9; i++) {DriverManager.getConnection(SampleGBaseJDBCLoadbalance.URL);}
……

上述代码会创建 9 个连接,假设三个节点都是可用状态,执行结果是每个节点分配到三个连接;如果其中一个节点不可用状态,GBaseJDBC 驱动会把 9个数据库连接请求分配到另外两个节点上。

注:高可用负载均衡功能集包含高可用性,即当开始高可用负载均衡时高可用性同时开启。

4 GBase JDBC 使用示例

本章节给大家介绍几个jdbc的使用示例:

4.1 GBase JDBC 获取加载任务信息示例 

Jdbc 新增了用于获取加载任务 ID 号,加载数据跳过行数的功能。因为 jdbc标准接口并不包含该方法定义,故用户在使用时需要将标准的 Statement 转化为 com.gbase.jdbc.StatementImpl 类型方可使用。因为加载 sql 语法是在 8611 版本中引入的,故该功能仅支持 8611 版本以上集群。

1) 获取数据跳过行数示例
该功能需要 gbase-connector-java-8.3.81.53-build54.1 以上版本支持(含 54.1)
String loadSql="load data infile 'ftp://test:123456@192.168.7.182/1.txt' into table loadtest fields terminated by ','";
Connection conn =DriverManager.getConnection(URL);
StatementImpl stmt = (StatementImpl) conn.createStatement();
stmt.execute("drop table if exists loadtest");
stmt.execute("create table loadtest(a int, b varchar(100))");
stmt.executeUpdate(loadSql);
long skippedLines = stmt.getSkippedLines();

2) 获取任务 ID 示例

该功能需要 gbase-connector-java-8.3.81.53-build54.2 以上版本支持(含 54.2)
String loadSql="load data infile 'ftp://test:123456@192.168.7.182/1.txt' into table loadtest fields terminated by ','";
Connection conn =DriverManager.getConnection(URL);
StatementImpl stmt = (StatementImpl) conn.createStatement();
stmt.execute("drop table if exists loadtest");
stmt.execute("create table loadtest(a int, b varchar(100))");
stmt.executeUpdate(loadSql);
long taskID = stmt.getLoadTaskID();

4.2 Ipv6 使用示例 

从 jdbc 版本 build54.4.8 开始支持使用 ipv6 与数据库连接。使用方式除了 url 设置有区别外,其他操作完全一样。
使用步骤如下:
1) 首先安装支持ipv6对应的集群版本,安装后假设ip地址为:2001:da8:e000::1:1:1
2) 使用 jdbc 对集群进行操作,支持如下两种配置方式设置 url 为:

jdbc:gbase://(2001:da8:e000::1:1:1):5258/bht?user=gbase&password=gbase20110531或者jdbc:gbase://[2001:da8:e000::1:1:1]:5258/bht?user=gbase&password=gbase20110531

即只需要将协议中 ip 地址用()或者[]括起来,其他使用方式同原来一样。注意: 

1. 在使用 hostList 参数时,该参数对应的 ip 不需要使用()或者[]进行包围。
2. 使用[]时需要 jdbc 55.2.1 版本支持。

4.3 Utf8mb4 编码使用示例 

从 jdbc 版本 build54.4.8 开始支持 utf8mb4 编码。如果数据库设置使用了utf8mb4 编码,相应的 jdbc 也要对应支持。使用步骤如下:

1) 集群已安装支持 utf8mb4 版本,并且设置了字符集编码为 utf8mb4
2) 设置 url 为如下:jdbc:gbase://192.168.7.126:5258/bht?user=gbase&password=gbase20110531&useUnicode=true&characterEncoding=utf8

即只需要在 url 上设置 useUnicode=true&characterEncoding=utf8 即可。

4.4 GB18030 编码使用示例 

从 jdbc 版本 build55.2.1 开始支持 gb18030 编码。如果数据库设置使用了gb18030 编码,相应的 jdbc 也要对应支持。使用步骤如下:

1) 集群已安装支持 gb18030 版本,并且设置了字符集编码为 gb18030
2) 设置 url 为如下:jdbc:gbase://192.168.7.126:5258/bht?user=gbase&password=gbase20110531&useUnicode=true&characterEncoding= gb18030

即只需要在 url 上设置 useUnicode=true&characterEncoding= gb18030 即。

4.5 连接虚拟集群

jdbc 驱动从 build55 版本开始支持虚拟集群的连接,如果 8a 集群支持虚拟集群,请申请 jdbc build55 以上版本。

使用方式非常简单,通过 url 参数配置 vcName 为具体的虚拟集群名称即可。注意该参数必须配置,且url必须明确指定数据库名称。具体配置样例如下:

jdbc:gbase://192.168.8.22/gbase?user=gbase&password=gbase20110531&vcName=vc2

4.6 Jdbc 使用 ssl 加密传输数据 

如果使用 jdbc 进行 ssl 数据传输,前提是必须 server 支持,必须先开启 server端的 ssl 功能。开启集群步骤如下:

1)生成 ssl 文件(直接在 linux 下执行即可)
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
此步骤可能出现提示,直接忽略即可

2) 拷贝三个文件到某个目录下,在gcluster*.cnf下设置如下内容:
ssl-ca=/usr/local/myssl/ca-cert.pem
ssl-cert=/usr/local/myssl/server-cert.pem
ssl-key=/usr/local/myssl/server-key.pem

3) 重启集群然后通过show variables like '%SSL%'查看是否开启ssl功能。如下为开启:

show variables like '%ssl%';
+---------------+-------------------------------------------+
| Variable_name | Value                                     |
+---------------+-------------------------------------------+
| have_openssl  | YES                                       |
| have_ssl      | YES                                       |
| ssl_ca        | /usr/local/myssl/ca-cert.pem              |
| ssl_capath    |                                           |
| ssl_cert      | /usr/local/myssl/server-cert.pem          |
| ssl_cipher    |                                           |
| ssl_key       | /usr/local/myssl/server-key.pem           |
+---------------+-------------------------------------------+

经过前面三步集群已经开启ssl功能,针对jdbc按照如下使用步骤

1)生成jdbc连接用密钥:keytool -import -alias GBaseCACert -file ca-cert.pem -keystore truststore 

说明:ca-cert.pem为生成ssl文件时生成的文件,执行该步骤后会提示输入认证,即密码,比如输入password1(jdbc会用到)

openssl x509 -outform DER -in client-cert.pem -out client.certkeytool -import -file client.cert -keystore keystore -alias GBaseClientCertificate 

说明:client.cert为生成ssl文件时生成的文件,执行该步骤后会提示输入认证,即密码,比如输入password1,(jdbc会用到)

2)上述步骤会生成两个文件truststore,keystore,将这两个文件拷贝到jdbc可以访问的路径下

3) 按照如下样例编写代码:
String url = "jdbc:gbase://192.168.8.27:5258/gbase?user=root&useSSL=true&requireSSL=true";
String trustStorePath = "D:\\JDBCTest\\src\\test-certs\\truststore";
String keyStorePath = "D:\\JDBCTest\\src\\test-certs\\keystore";
System.setProperty("javax.net.ssl.keyStore", keyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword", "password1");
System.setProperty("javax.net.ssl.trustStore", trustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "password1");
Connection conn = DriverManager.getConnection(url);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("show status like '%SSL%'");
while(rs.next()){System.out.println(rs.getString(1)+"-----"+rs.getString(2));}
以上就是使用jdbc ssl功能步骤。

4.7 通过 Jdbc 修改过期密码 

jdbc 版本从 build55.3.1 开始支持通过 jdbc 修改数据库密码。使用方式为通过新增方法 PasswordChangeUtil.changePassword(String url, String newPassword);其中参数 1 为合理的 url,且 url 中包含原始的用户名密码信息,参数 2 为新的密码。样例如下:

String url="jdbc:gbase://192.168.7.126:5258/gbase?user=bht&password=111111";
PasswordChangeUtil.changePassword(url, "222222");

4.8  通过 url 参数控制取出的列信息是否进

行大小写转换。 jdbc 版 本 从 build55.4.1 开 始 支 持 通 过 jdbc url 参 数 控 制 对getColumnName 和 getColumnLabel 方法返回的结果进行大小写转换。样例如下:
1)转换为大写
String url="jdbc:gbase://192.168.7.126:5258/gbase?user=bht&password=111111&caseSensitiveFlag=2";

如下代码label,name为大写
String sql = "select col1 tzm ,Col2 列a,col3 Hj from bht2";
ResultSet rs = this.stm.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
while(rs.next()){
for(int i=1;i<=count;i++){
String label = rsmd.getColumnLabel(i);
String name = rsmd.getColumnLabel(i);
}
}
rs.close();

以上为南大通用JDBC接口的一些介绍,欢迎大家从南大通用官网获取程序试用学习:GBase 8a MPP Cluster V9|下载中心|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商,谢谢~

原文链接:https://www.gbase.cn/community/post/4300
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值