更新时间:2024-11-05 GMT+08:00

连接数据库

在创建数据库连接之后,才能使用它来执行SQL语句操作数据。

如果您使用的是开源的JDBC驱动程序,应确保数据库参数password_encryption_type取值设置为1,如果参数值不为1,可能会出现连接失败,典型的报错信息比如:“none of the server's SASL authentication mechanisms are supported”,参见以下操作:

  1. 将数据库参数password_encryption_type修改为1,修改方法参见修改数据库参数
  2. 新建一个数据库用户用于连接,或者重置准备使用的数据库用户的密码。
    • 如果您使用的是管理员账号,参见重置密码
    • 如果是普通用户,可以先通过其他客户端工具(例如Data Studio)连接数据库后,使用ALTER USER语句来修改密码。
  3. 再尝试连接数据库。

需要执行以上操作的原因:

  • 调整参数的原因:当前MD5算法已被证实可以人工碰撞,已严禁将之用于密码校验算法。GaussDB(DWS) 采用默认安全设计,默认禁止MD5算法的密码校验,而PostgreSQL的开源libpq通信协议恰恰使用的是MD5算法。所以需要调整密码算法参数password_encryption_type,打开MD5算法。
  • 修改密码的原因:GaussDB(DWS) 中是不会存储您的密码原文的,而是存储的密码HASH摘要(默认是SHA256摘要),在密码校验时该摘要会与客户端发来的密码摘要进行比对(中间会有加盐操作)。故当您只是单纯调整了密码算法策略时,数据库是无法还原您的密码进而再生成MD5的摘要值的,必须要求您手动修改一次密码或者创建一个新用户,这时新的密码将会采用您设置的HASH算法进行摘要存储,用于下次连接认证。

函数原型

JDBC提供了三个方法,用于创建数据库连接。

  • DriverManager.getConnection(String url);
  • DriverManager.getConnection(String url, Properties info);
  • DriverManager.getConnection(String url, String user, String password);

参数

表1 数据库连接参数

参数

描述

url

gsjdbc4.jar数据库连接描述符。格式如下:

  • 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地址,当集群绑定弹性负载均衡(ELB)时,应设置为ELB的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驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数(参见connection_info)里;同时可以在PG_STAT_ACTIVITYPGXC_STAT_ACTIVITY中查询到。

user

数据库用户。

password

数据库用户的密码。

关闭连接

在使用数据库连接完成相应的数据操作后,需要关闭数据库连接。

关闭数据库连接可以直接调用其close方法即可。如:conn.close()

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//以下用例以gsjdbc4.jar为例,如果要使用gsjdbc200.jar,请替换驱动类名(将代码中的“org.postgresql”替换成“com.huawei.gauss200.jdbc”)与连接URL串前缀(将“jdbc:postgresql”替换为“jdbc:gaussdb”)。
//以下代码将获取数据库连接操作封装为一个接口,可通过给定用户名和密码来连接数据库。

public static Connection GetConnection(String username, String passwd) {
        //驱动类。
        String driver = "org.postgresql.Driver";
        //数据库连接描述符。
        String sourceURL = "jdbc:postgresql://10.10.0.13:8000/postgres?currentSchema=test";
        Connection conn = null;
        
        try {
            //加载驱动。
            Class.forName(driver);
        } catch (ClassNotFoundException e ){
            e.printStackTrace();
            return null;
        }
        
        try {
             //创建连接。
            conn = DriverManager.getConnection(sourceURL, username, passwd);
            System.out.println("Connection succeed!");
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
        
        return conn;
    }