
# 连接数据库
在创建数据库连接之后，才能使用它来执行SQL语句操作数据。
#### 前提条件
如果您使用的是开源的JDBC驱动程序，应确保数据库参数password_encryption_type取值设置为1，如果参数值不为1，可能会出现连接失败，典型的报错信息比如："none of the server's SASL authentication mechanisms are supported"，可参考如下操作进行处理：
1. 联系技术支持人员检查数据库参数password_encryption_type是否为1，如果取值不为1，需要将该参数修改为1。
2. 新建一个数据库用户用于连接，或者重置准备使用的数据库用户的密码。
   - 如果您使用的是管理员账号，参考[重置DWS数据库系统管理员密码](https://support.huaweicloud.com/mgtg-dws/dws_01_0026.html)章节进行密码重置。
   
   - 如果是普通用户，可以先通过其他客户端工具（例如Data Studio）连接数据库后，使用ALTER USER语句来修改密码。
    
3. 再尝试连接数据库。
需要执行以上操作的原因：
- 调整参数的原因：当前MD5算法已被证实可以人工碰撞，已严禁将之用于密码校验算法。DWS采用默认安全设计，默认禁止MD5算法的密码校验，可能导致开源客户端无法正常连接的问题。所以需要调整密码算法参数password_encryption_type，打开MD5算法。
- 修改密码的原因：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地址。 由于安全原因，数据库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驱动会将当前驱动的部署路径、进程属主用户上报到数据库中，记录在connection_info参数（参见[connection_info](https://support.huaweicloud.com/devg-dws/dws_04_0889.html#ZH-CN_TOPIC_0000001764491936__section4834457114318)）里；同时可以在[PG_STAT_ACTIVITY](https://support.huaweicloud.com/devg-dws/dws_04_0755.html)和[PGXC_STAT_ACTIVITY](https://support.huaweicloud.com/devg-dws/dws_04_0820.html)中查询到。    |
| user     | 数据库用户。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| password | 数据库用户的密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
#### 关闭连接
在使用数据库连接完成相应的数据操作后，需要关闭数据库连接。
关闭数据库连接可以直接调用其close方法即可。如：**conn.close()**
#### 示例
```
//以下用例以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;
    }
```
