使用JDBC和ODBC连接集群 前提条件 已安装JDK 1.6或以上版本,并配置环境变量。 已下载JDBC驱动,请参见上方:下载JDBC或ODBC驱动。 DWS 也支持开源的JDBC驱动程序:PostgreSQL JDBC驱动程序9.31103或更高版本。 已下载SSL证书文件,请参见使用SSL进行安全的TCP/IP连接“在gsql客户端配置SSL认证相关的数字证书参数”章节中的“下载SSL证书”。 使用JDBC连接数据库 在Linux和Windows环境下操作方法相同,以下步骤以Windows环境为例。 1. 是否采用SSL方式连接DWS 集群。 是,参见使用SSL进行安全的TCP/IP连接设置SSL连接章节中的开启SSL连接,默认为开启。执行步骤2。 否,参见使用SSL进行安全的TCP/IP连接设置SSL连接章节中的关闭SSL连接,执行步骤4。 2. (可选)如果使用Linux环境,使用WinScp工具将SSL证书上传到Linux环境上。 3. 配置证书以使用SSL加密连接。 a.下载windows版本的OpenSSL工具。当前不支持OpenSSL 3.0.0,请选择下载“Win64 OpenSSL v1.1.1L Light”版本。 b.双击安装包“Win64OpenSSLLight111L.exe”安装到C盘默认路径即可,选择复制DLLs文件到OpenSSL目录下,如下图,剩余步骤默认单击下一步直到安装成功。 c.安装环境变量。单击本地PC左下角“开始”,右击“此电脑”,选择“更多 > 属性 > 高级系统设置”,切换到“高级”,单击“环境变量”。 d.在下方“系统变量”,双击“Path”变量,单击“新建”,在最后一行增加Openssl的bin路径,例如“C:Program FilesOpenSSLWin64bin”,单击“确定”,再次单击“确定”,配置变量成功。 e.解压压缩包得到证书文件。假设解压路径为“C:”。 证书文件建议保存在英文路径,配置证书时需要根据实际情况指定路径,否则可能提示文件不存在。 f.打开“命令提示符”程序,切换到“C:dwssslcertsslcert”路径下,执行以下两条命令,转化根证书并导入到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”确认信任证书。 g.执行以下命令转化客户端私钥。 openssl pkcs12 export out client.pkcs12 in client.crt inkey client.key 需要输入客户端私钥的密码“Gauss@MppDB”,然后输入并确认用户自定义的私钥密码。 h.执行以下命令,将私钥导入到keyStore中。 keytool importkeystore deststorepass Gauss@MppDB destkeystore client.jks srckeystore client.pkcs12 srcstorepass password srcstoretype PKCS12 alias 1 说明 命令中“ password ”为示例自定义密码,具体请根据用户实际输入密码为准。 回显如下类似信息且没有报错,则表示导入成功。此时“C:dwssslcertsslcert”下会生成目标密钥文件:client.jks。 4. 下载包名为dws8.1.xjdbcdriver.zip的驱动包,解压后有两个JDBC的驱动jar包“gsjdbc4.jar”和“gsjdbc200.jar”,用户可根据需求选择。 5. 在应用程序的工程中,设置引用Jar包。 以Eclipse工程为例,先将jar包存放在工程目录下,例如将jar包放在工程目录的lib目录下,然后在Eclipse工程中,右键单击lib目录下的该jar包,再选择菜单“Build Path”,即可引用此jar包。 详见下图:引用jar包 6. 加载驱动。 支持以下两种方法加载: 在代码中隐含装载:Class.forName("org.postgresql.Driver"); 在JVM启动时参数传递:java Djdbc.driversorg.postgresql.Driver jdbctest 说明 DWS 下载的JDBC驱动包中提供gsjdbc.jar。 gsjdbc4.jar:与PostgreSQL保持兼容,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统中使用。 7. 调用JDBC的数据库连接方法DriverManager.getConnection()连接DWS 数据库。 JDBC接口不提供重试连接的能力,您需要在业务代码中实现重试处理。 DriverManager.getConnection()方法支持以下重载: DriverManager.getConnection(String url); DriverManager.getConnection(String url, Properties info); DriverManager.getConnection(String url, String user, String password); 数据库连接参数 参数 描述 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地址。 DWS管理控制台上集群的连接IP,根据网络环境判断,如果连接DWS的机器跟DWS集群在同一个网络下,则选择内网IP,不在同一个网络下,则选择公网IP。 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驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connectioninfo参数里;同时可以在PGSTATACTIVITY和PGXCSTATACTIVITY中查询到。 user 数据库用户。 password 数据库用户的密码。 以SSL证书方式加密连接样例代码如下: //以下代码将获取数据库SSL连接操作封装为一个接口。 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" + ':' "8000" + '/' "gaussdb"; Connection conn null; try { //加载驱动。 Class.forName(driver); } catch( Exception e ) { e.printStackTrace(); return null; } try { //创建连接。 conn DriverManager.getConnection(url, props ); System.out.println("Connection succeed!"); } catch(Exception e) { e.printStackTrace(); return null; } return conn; } 8. 执行SQL语句。 a.创建语句对象。 Statement stmt con.createStatement(); b.执行语句对象。 int rc stmt.executeUpdate("CREATE TABLE tab1(id INTEGER, name VARCHAR(32));"); c.释放语句对象。 stmt.close(); 9. 调用方法close()关闭连接。