
# Java示例
#### 操作场景
通过Java连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种，其中使用SSL证书连接通过了加密功能，具有更高的安全性。DDS新实例默认关闭SSL数据加密，开启SSL请参考[设置SSL数据加密](https://support.huaweicloud.com/usermanual-dds/dds_03_0074.html)。SSL连接实现了数据加密功能，但同时也会增加网络连接响应时间和CPU消耗，不建议开启SSL数据加密。
#### 前提条件
用户需要具备以下技能：
- 熟悉计算机基础知识。
- 了解Java编程语言。
 
#### 驱动获取及使用
- Jar驱动下载地址：<https://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/3.0.4/>
- 使用指南请参考：<https://mongodb.github.io/mongo-java-driver/4.2/driver/getting-started/installation/>
 
#### 操作步骤
- [使用SSL证书连接]
  ![](https://support.huaweicloud.com/usermanual-dds/public_sys-resources/note_3.0-zh-cn.png)
  - 该方式属于SSL连接模式，需要下载SSL证书，通过证书校验并连接数据库。
  
  - 您可以在"实例管理"页面，单击实例名称进入"基本信息"页面，单击"数据库信息"模块"SSL"处的![](https://support.huaweicloud.com/usermanual-dds/zh-cn_image_0000002050165208.png)，下载根证书或捆绑包。
  
  - SSL连接指南请参考：MongoDB Java Driver官方文档：<https://www.mongodb.com/docs/drivers/java/sync/current/fundamentals/connection/tls/#std-label-tls-ssl>。
  
  - Java 8之前的Java运行时环境(JRE)仅在更新版本中启用TLS 1.2协议。如果您的JRE尚未启用TLS 1.2协议，请升级到更高版本以使用TLS 1.2进行连接。
   
  通过Java连接副本集，代码中的Java链接格式如下：
  ```
  mongodb://<username>:<password>@<instance_ip>:<instance_port>/<database_name>?authSource=admin&replicaSet=replica&ssl=true
  ```
  表1参数说明 
  | 参数                | 说明                                                   |
  |:---|:---|
  | \<username\>      | 当前用户名。                                               |
  | \<password\>      | 当前用户的密码。                                             |
  | \<instance_ip\>   | 如果通过弹性云服务器连接，"instance_ip"是主机IP，即"基本信息"页面该实例的"内网地址"。 |
  | \<instance_ip\>   | 如果通过连接了公网的设备访问，"instance_ip"为该实例已绑定的"弹性公网IP"。        |
  | \<instance_port\> | 端口，默认8635，当前端口，参考"基本信息"页面该实例的"数据库端口"。                |
  | \<database_name\> | 数据库名，即需要连接的数据库名。                                     |
  | authSource        | 鉴权用户数据库，取值为admin。                                    |
  | ssl               | 连接模式，值为true代表是使用ssl连接模式。                             |
     
  使用keytool工具配置CA证书，参数请参见[表2]:
  ```
  keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <password>
  ```
   表2参数说明 
  | 参数                                     | 说明                                       |
  |:---|:---|
  | \<path to certificate authority file\> | ssl证书的存放地址。                              |
  | \<path to trust store\>                | 信任库的存放地址。自定义即可，例如：./trust/certs.keystore |
  | \<password\>                           | 自定义密码。                                   |
     
  在程序中设置JVM系统属性以指向正确的信任库和密钥库：
  - System.setProperty("javax.net.ssl.trustStore","\<path to trust store\>");
  
  - System.setProperty("javax.net.ssl.trustStorePassword","\<password\>");
   
  连接副本集的Java代码，可参考以下示例：
  ```
  public class Connector {
      public static void main(String[] args) {
          try {
              System.setProperty("javax.net.ssl.trustStore", "./trust/certs.keystore");
              System.setProperty("javax.net.ssl.trustStorePassword", "123456");
              ConnectionString connString = new ConnectionString("mongodb://<username>:<password>@<instance_ip>:<instance_port>/<database_name>?authSource=admin&replicaSet=replica&ssl=true");
              MongoClientSettings settings = MongoClientSettings.builder()
                      .applyConnectionString(connString)
                      .applyToSslSettings(builder -> builder.enabled(true))
                      .applyToSslSettings(builder -> builder.invalidHostNameAllowed(true))
                      .build();
              MongoClient mongoClient = MongoClients.create(settings);
              MongoDatabase database = mongoClient.getDatabase("admin");
              //ping数据库，如果失败抛出异常
              BsonDocument command = new BsonDocument("ping", new BsonInt64(1));
              Document commandResult = database.runCommand(command);
              System.out.println("Connect to database successfully");
          } catch (Exception e) {
              e.printStackTrace();
              System.out.println("Test failed");
          }
      }
  }
  ```
- [无证书连接]
  ![](https://support.huaweicloud.com/usermanual-dds/public_sys-resources/note_3.0-zh-cn.png)
  该方式属于非SSL连接模式，不对服务端进行证书校验，用户无需下载SSL证书。
  通过Java连接副本集实例，代码中的Java链接格式如下：
  ```
  mongodb://<username>:<password>@<instance_ip>:<instance_port>/<database_name>?authSource=admin&replicaSet=replica
  ```
  表3参数说明 
  | 参数                | 说明                                                   |
  |:---|:---|
  | \<username\>      | 当前用户名。                                               |
  | \<password\>      | 当前用户的密码。                                             |
  | \<instance_ip\>   | 如果通过弹性云服务器连接，"instance_ip"是主机IP，即"基本信息"页面该实例的"内网地址"。 |
  | \<instance_ip\>   | 如果通过连接了公网的设备访问，"instance_ip"为该实例已绑定的"弹性公网IP"。        |
  | \<instance_port\> | 端口，默认8635，当前端口，参考"基本信息"页面该实例的"数据库端口"。                |
  | \<database_name\> | 数据库名，即需要连接的数据库名。                                     |
  | authSource        | 鉴权用户数据库，取值为admin。                                    |
     
  连接副本集的Java代码，可参考以下示例：
  ```
  public class Connector {
      public static void main(String[] args) {
          try {
              ConnectionString connString = new ConnectionString("mongodb://<username>:<password>@<instance_ip>:<instance_port>/<database_name>?authSource=admin&replicaSet=replica");
              MongoClientSettings settings = MongoClientSettings.builder()
                      .applyConnectionString(connString)
                      .retryWrites(true)
                      .build();
              MongoClient mongoClient = MongoClients.create(settings);
              MongoDatabase database = mongoClient.getDatabase("admin");
              //ping数据库，如果失败抛出异常
              BsonDocument command = new BsonDocument("ping", new BsonInt64(1));
              Document commandResult = database.runCommand(command);
              System.out.println("Connect to database successfully");
          } catch (Exception e) {
              e.printStackTrace();
              System.out.println("Test failed");
          }
      }
  ```
  }
#### 相关文档
[设置SSL数据加密](https://support.huaweicloud.com/usermanual-dds/dds_03_0074.html)
[通过程序代码连接副本集实例](https://support.huaweicloud.com/usermanual-dds/dds_03_0339.html)
