
# 不同场景下配置连接参数
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
以下示例场景中node代表"host:port"，host为数据库服务器名称或IP地址，port为数据库服务器端口。
#### 容灾场景
某客户有两套数据库集群，其中A集群为生产集群，B集群为容灾集群。当客户执行容灾切换时，A集群将降为容灾集群，B集群将升为生产集群。此时为了避免修改配置文件导致的应用重启或重新发版，客户可在初始配置文件时，即将A、B集群写入连接串中。此时在主集群不可连接时，驱动将尝试对容灾集群建立连接。例如A集群为{node1,node2,node3}。B集群为{node4,node5,node6}。
以Dorado双集群为例，url可参考如下命令进行配置，当主备切换后只会连接新的主集群。
```
jdbc:gaussdb://node1,node2,node3,node4,node5,node6/database?priorityServers=3
```
但需注意，以上配置在基于流式复制的异地容灾场景中，若对灾备集群实施灾备升主（failover），将导致双主集群同时运行，此时业务可能无法自动连接至预期的新主集群。针对此场景，可采用两种方案：
- 按照上述统一的url配置，但需通过额外管控手段在failover后对原主集群实施隔离。
- 将url按主备集群拆分为如下两条配置，在failover时由业务端主动切换连接。
  ```
  jdbc:gaussdb://node1,node2,node3/database
  jdbc:gaussdb://node4,node5,node6/database
  ```
  
基于流式复制的异地容灾场景推荐使用容灾读业务方案：
主集群的url可参考如下命令进行配置：
```
jdbc:gaussdb://node1,node2,node3/database?autoBalance=true&disasterToleranceCluster=true
```
灾备集群的url可参考如下命令进行配置：
```
jdbc:gaussdb://node4,node5,node6/database?autoBalance=true&disasterToleranceCluster=true
```
主集群和灾备集群应各配置一套读写业务与只读业务。读写应用A（A城）、只读应用B（A城）和只读应用B（B城）正常启用，读写应用A（B城）关闭业务流量。请参见[图1]。
图1正常运行时状态
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590360902.png "点击放大")
当switchover发生时，数据库与应用分别进行容灾切换，读写应用A（A城）需先关闭业务流量，switchover成功后，读写应用A（B城）、只读应用B（B城）和只读应用B（A城）正常启用。请参见[图2]。
图2集群间switchover场景
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620720477.png "点击放大")
当failover发生时，A城集群不可用，需先将读写应用A（A城）和只读应用B（A城）关闭业务流量以防止数据不一致问题，B城集群再执行升主failover操作。当B城集群Normal后，读写应用A（B城）和只读应用B（B城）正常启用，读写应用A（A城）和只读应用B（A城）关闭业务流量。请参见[图3]。
图3failover场景
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590200966.png "点击放大")
#### 负载均衡场景
某客户存在一套数据库集群，包含如下节点{node1,node2,node3,node4,node5,node6,node7,node8,node9,node10,node11,node12}。
- 非透明多写特性下，客户在应用程序A中建立了120个长连接，并期望应用程序A上的连接可以均匀分布在集群各节点上，则url可参考如下命令进行配置。
  ```
  jdbc:gaussdb://node1,node2,node3/database?autoBalance=true
  ```
  
- 非透明多写特性下，客户新开发了两个应用程序B、C，希望当前这三个应用程序均匀分布在指定节点，如应用程序A的连接分布在{node1,node2,node3,node4}，应用程序B的连接分布在{node5,node6,node7,node8}，应用程序C的连接分布在{node9,node10,node11,node12}，则url可参考如下命令进行配置（若url中前四个节点都不可连，应用会连接第五个节点，根据pgxc_node表中的信息，在集群中所有可用节点之间进行轮询连接）。
  应用程序A：
  ```
  jdbc:gaussdb://node1,node2,node3,node4,node5/database?autoBalance=priority4
  ```
  应用程序B：
  ```
  jdbc:gaussdb://node5,node6,node7,node8,node9/database?autoBalance=priority4
  ```
  应用程序C：
  ```
  jdbc:gaussdb://node9,node10,node11,node12,node13/database?autoBalance=priority4
  ```
  
- 非透明多写特性下，客户开发了一些应用程序，并且使用相同的连接配置串，同时期望各应用连接能较均匀分布在集群各节点上，则url可参考如下命令进行配置。
  ```
  jdbc:gaussdb://node1,node2,node3,node4/database?autoBalance=shuffle
  ```
  
- 非透明多写特性下，客户开发了一些应用程序，想通过单节点会话模式建立连接，则url可参考如下命令进行配置。
  ```
  jdbc:gaussdb://node1,node2,node3,node4/database?sessionType=singleNode&execTargetNode=dn_name
  ```
  
- 非透明多写特性下，客户不使用负载均衡功能，则url可参考如下命令进行配置。
  ```
  jdbc:gaussdb://node1/database
  ```
  或：
  ```
  jdbc:gaussdb://node1/database?autoBalance=false
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  非透明多写特性下，在开启autoBalance参数时，JDBC刷新可用CN列表的周期默认为10s，可使用refreshCNIpListTime进行设置，示例如下：
  ```
  jdbc:gaussdb://node1,node2,node3,node4/database?autoBalance=true&refreshCNIpListTime=3
  ```
  
 
#### 日志诊断场景
某客户在使用中出现数据导入慢或出现一些难以分析的异常报错时，可通过开启trace日志进行诊断，url可参考如下命令进行配置：
非透明多写特性
```
jdbc:gaussdb://node1/database?loggerLevel=trace
```
#### 高性能场景
某客户对于相同SQL可能多次执行，仅是输入参数不同的情况，为了提升执行效率，可配置[prepareThreshold](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0086.html#ZH-CN_TOPIC_0000002590200684__p332086184618)参数，避免重复生成执行计划，url可参考如下命令进行配置：
非透明多写特性
```
jdbc:gaussdb://node1/database?prepareThreshold=5
```
某客户一次查询1000万行数据，为避免同时返回造成内存溢出，可使用[defaultRowFetchSize](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0086.html#ZH-CN_TOPIC_0000002590200684__p153217616467)，url可参考如下命令进行配置：
非透明多写特性
```
jdbc:gaussdb://node1/database?defaultRowFetchSize=50000
```
某客户需要批量插入1000万行数据，为提升效率，可使用[batchMode](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0086.html#ZH-CN_TOPIC_0000002590200684__p9320116154615)，url可参考如下命令进行配置：
非透明多写特性
```
jdbc:gaussdb://node1/database?batchMode=on
```
#### 大小写转换场景
在GaussDB中元数据默认存储为小写，如果从元数据默认存储为大写的数据库迁移至GaussDB，大写的元数据会变为小写。如果原业务中涉及到大写元数据的处理，可以开启uppercaseAttributeName参数，但是不建议通过这种方式来解决问题，建议通过修改业务代码来解决。如果一定要使用，请务必确认当前数据库中的元数据是否全为小写，以避免出现问题。url可参考如下命令进行配置：
非透明多写特性
```
jdbc:gaussdb://node1/database?uppercaseAttributeName=true
```
对于DatabaseMetaData中涉及的接口，按照入参直接调用即可，对于ResultSetMetaData中涉及的接口调用方法如下所示：
```
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test_supper");
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
    System.out.println(rsmd.getColumnLabel(i) + "   " + rsmd.getColumnName(i));
}
```
