• 沒有找到結果。

4.5 使用 JDBC 和 ODBC 连接集群

4.5.3 使用 JDBC 连接数据库

GaussDB(DWS) 支持在Linux或Windows环境下使用JDBC应用程序连接数据库。应用 程序可以在华为云平台环境的弹性云服务器中,或者互联网环境连接数据库。

用户通过JDBC连接GaussDB(DWS) 集群时,可以选择是否采用SSL认证方式。SSL认 证用于加密客户端和服务器之间的通讯数据,为敏感数据在Internet上的传输提供了一 种安全保障手段。GaussDB(DWS) 管理控制台提供了自签的证书供用户下载。使用该

证书,用户需要配置客户端程序,使证书可用,此过程依赖于openssl工具以及java自 带的keytool工具。

说明

SSL模式安全性高于普通模式,建议在使用JDBC连接GaussDB(DWS) 集群时采用SSL模式。

JDBC接口的使用方法,请自行查阅官方文档。

前提条件

● 已安装JDK 1.6或以上版本,并配置环境变量。

● 已下载JDBC驱动,请参见下载JDBC或ODBC驱动。

GaussDB(DWS) 也支持开源的JDBC驱动程序:PostgreSQL JDBC驱动程序 9.3-1103或更高版本。

● 已下载SSL证书文件,请参见(可选)下载SSL证书。

使用 JDBC 连接数据库

在Linux和Windows环境下操作方法相同,以下步骤以Windows环境为例。

步骤1 是否采用SSL方式连接GaussDB(DWS) 集群。

● 是,参见(可选)设置SSL连接开启SSL连接,默认为开启。执行步骤2。

● 否,参见(可选)设置SSL连接关闭SSL连接,执行步骤4。

步骤2 (可选)如果使用Linux环境,使用WinScp工具将SSL证书上传到Linux环境上。

步骤3 配置证书以使用SSL加密连接。

1. 下载windows版本的OpenSSL工具。下载地址:http://slproweb.com/products/

Win32OpenSSL.html,当前不支持OpenSSL 3.0.0,请选择下载“Win64

OpenSSL v1.1.1L Light”版本。

2. 双击安装包“Win64OpenSSL_Light-1_1_1L.exe”安装到C盘默认路径即可,选择 复制DLLs文件到OpenSSL目录下,如下图,剩余步骤默认单击下一步直到安装成 功。

3. 安装环境变量。单击本地PC左下角“开始”,右击“此电脑”,选择“更多 > 属 性 > 高级系统设置”,切换到“高级”,单击“环境变量”。

4. 在下方“系统变量”,双击“Path”变量,单击“新建”,在最后一行增加 Openssl的bin路径,例如“C:\Program Files\OpenSSL-Win64\bin”,单击“确 定”,再次单击“确定”,配置变量成功。

5. 解压压缩包得到证书文件。假设解压路径为“C:\”。

证书文件建议保存在英文路径,配置证书时需要根据实际情况指定路径,否则可 能提示文件不存在。

6. 打开“命令提示符”程序,切换到“C:\dws_ssl_cert\sslcert”路径下,执行以下 两条命令,转化根证书并导入到trustStore中。

openssl x509 -in cacert.pem -out cacert.crt.der -outform der

keytool -keystore mytruststore -alias cacert -import -file cacert.crt.der

– “cacert.pem”为解压后获取的根证书。

– “cacert.crt.der”为生成的中间文件。根据实际情况,可以填写保存到其他 路径,也可以自定义文件名称。

– “mytruststore”为生成的可信库名称,“cacert”为别名用户,二者可以根 据需要进行修改。

请用户根据提示信息输入自定义的可信库密码并确认密码,然后输入“y”确认信 任证书。

7. 执行以下命令转化客户端私钥。

openssl pkcs12 -export -out client.pkcs12 -in client.crt -inkey client.key

需要输入客户端私钥的密码“Gauss@MppDB”,然后输入并确认用户自定义的 私钥密码。

8. 执行以下命令,将私钥导入到keyStore中。

keytool -importkeystore -deststorepass Gauss@MppDB -destkeystore client.jks -srckeystore client.pkcs12 -srcstorepass key123 -srcstoretype PKCS12 -alias 1

说明

– 命令中“key123”为示例自定义密码,具体请根据用户实际输入密码为准。

– 回显如下类似信息且没有报错,则表示导入成功。此时“C:\dws_ssl_cert\sslcert”下会 生成目标密钥文件:client.jks。

步骤4 解压已下载的JDBC驱动得到“gsjdbc4.jar”。

步骤5 在应用程序的工程中,设置引用Jar包。

以Eclipse工程为例,先将jar包存放在工程目录下,例如将jar包放在工程目录的lib目录 下,然后在Eclipse工程中,右键单击lib目录下的该jar包,再选择菜单“Build

Path”,即可引用此jar包。

4-19 引用 jar 包

或者,您也可以使用另一种方式,在Maven工程中,可以直接将GaussDB(DWS) JDBC 驱动作为依赖项添加进POM文件,配置如下所示:

● gsjdbc4.jar

<dependency>

<groupId>com.huaweicloud.dws </groupId>

<artifactId>huaweicloud-dws-jdbc</artifactId>

<version>8.1.0</version>

</dependency>

● gsjdbc200.jar

<dependency>

<groupId>com.huawei.m2m.gauss</groupId>

<artifactId>gsjdbc200</artifactId>

<version>8.0.0</version>

</dependency>

步骤6 加载驱动。

支持以下两种方法加载:

● 在代码中隐含装载:Class.forName("org.postgresql.Driver");

● 在JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest

说明

GaussDB(DWS) 下载的JDBC驱动包中,同时提供gsjdbc4.jar和gsjdbc200.jar。

● gsjdbc4.jar:与PostgreSQL保持兼容,其中类名、类结构与PostgreSQL驱动完全一致,曾经 运行于PostgreSQL的应用程序可以直接移植到当前系统中使用。

● gsjdbc200.jar:如果同一JVM进程内需要同时访问PostgreSQL及GaussDB(DWS) 请使用该 驱动包。该包主类名为“com.huawei.gauss200.jdbc.Driver”(即将“org.postgresql”替换 为“com.huawei.gauss200.jdbc”) ,数据库连接的URL前缀为“jdbc:gaussdb”,其余与 gsjdbc4.jar相同。

● 从Maven仓库中下载的GaussDB(DWS) 驱动包和gsjdbc4相同。

步骤7 调用JDBC的数据库连接方法DriverManager.getConnection()连接GaussDB(DWS) 数 据库。

JDBC接口不提供重试连接的能力,您需要在业务代码中实现重试处理。

DriverManager.getConnection()方法支持以下重载:

● DriverManager.getConnection(String url);

● DriverManager.getConnection(String url, Properties info);

● DriverManager.getConnection(String url, String user, String password);

4-8 数据库连接参数

参数 描述

url 数据库连接描述符,可以在管理控制台查看,具体步骤请参见获取集群 连接地址。

url的格式如下:

● jdbc:postgresql:database

● jdbc:postgresql://host/database

● jdbc:postgresql://host:port/database

● jdbc:postgresql://host:port[,host:port][...]/database 说明

● 使用gsjdbc200.jar时,将“jdbc:postgresql”修改为“jdbc:gaussdb”

– database为要连接的数据库名称。

– host为数据库服务器名称或IP地址。

GaussDB(DWS)管理控制台上集群的连接IP,根据网络环境判断,如果连 接GaussDB(DWS)的机器跟GaussDB(DWS)集群在同一个网络下,则选择 内网IP,不在同一个网络下,则选择公网IP。

由于安全原因,数据库CN禁止集群内部其他节点无认证接入。如果要在集 群内部访问CN,请将JDBC程序部署在CN所在机器,host使用

"127.0.0.1"。否则可能会出现“FATAL: Forbid remote connection with trust method!”错误。

建议业务系统单独部署在集群外部,否则可能会影响数据库运行性能。

– port为数据库服务器端口。缺省情况下,会尝试连接到localhost的8000端 口的database。

– 支持多ip端口配置形式,jdbc自动实现了负载均衡,多ip端口配置形式是采 取随机访问+failover的方式,这个过程系统会自动忽略不可达IP。

以","隔开,例如jdbc:postgresql://10.10.0.13:8000,10.10.0.14:8000/

database

● 使用JDBC连接集群时集群链接地址只支持指定jdbc连接参数,不支持增加变量 参数。

参数 描述

info 数据库连接属性。常用的属性如下:

● user:String类型。表示创建连接的数据库用户。

● password:String类型。表示数据库用户的密码。

● ssl:Boolean类型。表示是否使用SSL连接。

● loggerLevel:string类型。为LogStream或LogWriter设置记录进 DriverManager当前值的日志信息量。目前支持"OFF"、"DEBUG"和

"TRACE"。 值为"DEBUG"时,表示只打印DEBUG级别以上的日志,

将记录非常少的信息。值等于TRACE时,表示打印DEBUG和TRACE级 别的日志,将产生详细的日志信息。默认值为OFF,表示不打印日 志。

● prepareThreshold:integer类型。用于确定在转换为服务器端的预备 语句之前,要求执行方法PreparedStatement的次数。缺省值是5。

● batchMode : boolean类型,用于确定是否使用batch模式连接。

● fetchsize : integer类型,用于设置数据库链接所创建statement的 默认fetchsize。

● ApplicationName:string类型。应用名称,在不做设置时,缺省值 为PostgreSQL JDBC Driver。

● allowReadOnly:boolean类型,用于设置connection是否允许设置 readonly模式,默认为false,若该参数不被设置为true,则执行 connection.setReadOnly不生效。

● blobMode:string类型,用于设置setBinaryStream方法为不同的数据 类型赋值,设置为on时表示为blob数据类型赋值,设置为off时表示 为bytea数据类型赋值,默认为on。

● connectionExtraInfo:Boolean类型。表示驱动是否上报当前驱动的 部署路径、进程属主用户到数据库。

说明取值范围:true或false,默认值为true。设置connectionExtraInfo为true,

JDBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在

public static Connection GetConnection(String username, String passwd) {

//定义驱动类。

String driver = "org.postgresql.Driver";

//设置keystore。

System.setProperty("javax.net.ssl.trustStore", "mytruststore");

System.setProperty("javax.net.ssl.keyStore", "client.jks");

System.setProperty("javax.net.ssl.trustStorePassword", "password");

System.setProperty("javax.net.ssl.keyStorePassword", "password");

Properties props = new Properties();

props.setProperty("user", username);

props.setProperty("password", passwd);

props.setProperty("ssl", "true");

String url = "jdbc:postgresql://" + "10.10.0.13" + ':'

Statement stmt = con.createStatement();

2. 执行语句对象。

int rc = stmt.executeUpdate("CREATE TABLE tab1(id INTEGER, name VARCHAR(32));");

3. 释放语句对象。

stmt.close();

步骤9 调用方法close()关闭连接。

----结束

示例代码

此示例将演示如何基于GaussDB(DWS) 提供的JDBC接口开发应用程序。

说明

在完成以下示例前,需要先创建存储过程。具体请参见教程:使用JDBC或ODBC开发。

create or replace procedure testproc ( psv_in1 in integer,

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.CallableStatement;

import java.sql.Types;

public class DBTest { //创建数据库连接。

public static Connection GetConnection(String username, String passwd) { String driver = "org.postgresql.Driver";

String sourceURL = "jdbc:postgresql://10.10.0.13:8000/gaussdb";

Connection conn = null;

try {

//加载数据库驱动。

Class.forName(driver).newInstance();

} catch (Exception e) {

conn = DriverManager.getConnection(sourceURL, username, passwd);

System.out.println("Connection succeed!");

} catch (Exception e) {

//执行普通SQL语句,创建customer_t1表。

public static void CreateTable(Connection conn) { Statement stmt = null;

try {

stmt = conn.createStatement();

//执行普通SQL语句。

int rc = stmt

.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));");

stmt.close();

} catch (SQLException e) { if (stmt != null) { try {

stmt.close();

public static void BatchInsertData(Connection conn) { PreparedStatement pst = null;

try {

//生成预处理语句。

pst = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?,?)");

for (int i = 0; i < 3; i++) {

public static void ExecPreparedSQL(Connection conn) { PreparedStatement pstmt = null;

try {

pstmt = conn

.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1");

pstmt.setString(1, "new Data");

public static void ExecCallableSQL(Connection conn) { CallableStatement cstmt = null;

try {

cstmt=conn.prepareCall("{? = CALL TESTPROC(?,?,?)}");

cstmt.setInt(2, 50);

cstmt.setInt(1, 20);

cstmt.setInt(3, 90);

cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。

cstmt.execute();

int out = cstmt.getInt(4); //获取out参数

System.out.println("The CallableStatment TESTPROC returns:"+out);

cstmt.close();

Connection conn = GetConnection("tester", "Password1234");

//创建表。

CreateTable(conn);

//批插数据。

BatchInsertData(conn);

//执行预编译语句,更新数据。

ExecPreparedSQL(conn);

//执行存储过程。

ExecCallableSQL(conn);

//关闭数据库连接。

GaussDB(DWS) 支持使用ODBC应用程序连接数据库。应用程序可以在华为云平台环 境的弹性云服务器中,或者互联网环境连接数据库。

ODBC接口的使用方法,请自行查阅官方文档。

前提条件

● 已下载Linux版本的ODBC驱动包“dws_odbc_driver_for_linux.zip”和Windows版 本的ODBC驱动包“dws_odbc_driver_for_windows.zip”,请参见下载JDBC或

ODBC驱动。

GaussDB(DWS) 也支持开源的ODBC驱动程序:PostgreSQL ODBC 09.01.0200或 更高版本。

● 已下载开源unixODBC代码文件,支持版本为2.3.0,下载地址:https://

sourceforge.net/projects/unixodbc/files/unixODBC/2.3.0/

unixODBC-2.3.0.tar.gz/download