# 配置JDBC连接（使用负载均衡方式）
#### 背景信息
很多用户在使用JDBC连接集群时只连接集群的一个CN，这就导致单个CN压力较大并且别的CN资源浪费，并且这种方式还有单点故障导致连接不可用的风险。
用户可使用JDBC连接多个CN避免以上问题。主要有以下三种方式：
- 使用ELB连接集群：弹性负载均衡（ELB）是将访问流量根据转发策略分发到后端多台弹性云服务器的流量分发控制服务，可以通过流量分发扩展应用系统对外的服务能力，提高应用程序的容错能力。
- 使用JDBC负载均衡连接集群：开启JDBC负载均衡，URL需要配置至少一个CN节点内网IP，之后会自动扫描所有的CN节点IP，JDBC负载均衡可以使连接随机到其中一个CN，从而实现类似ELB的效果。
- 使用multi-host方式连接集群：使用JDBC配置多个节点的方式，也能实现类似ELB的效果。
 
#### 方式一：使用ELB连接集群（推荐）
1. 获取弹性负载均衡地址。在[DWS管理控制台](https://console.huaweicloud.com/dws)打开指定集群详情页面，获取弹性负载均衡IP，绑定弹性负载均衡请参考[集群绑定和解绑ELB](https://support.huaweicloud.com/mgtg-dws/dws_01_0822.html)。
2. 配置驱动。请参见[下载JDBC或ODBC驱动](https://support.huaweicloud.com/mgtg-dws/dws_01_0032.html)。
   
   ```
   <dependency> 
       <groupId>com.huaweicloud.dws</groupId>  
       <artifactId>huaweicloud-dws-jdbc</artifactId>   
       <version>8.5.1</version> 
   </dependency>
   ```
   
   
3. 获取数据库连接。 
   ```
   private static final String USER_NAME = "dbadmin";
   private static final String PASSWORD = "password";
   // jdbc:postgresql://ELB_IP:PORT/dbName"
   private static final String URL = "jdbc:postgresql://192.160.0.10:8000/gaussdb";
   private static Properties properties = new Properties();
   static {
       properties.setProperty("user", USER_NAME);
       properties.setProperty("password", PASSWORD);
   }
   /**
    * 获取数据库连接
    */
   public static Connection getConnection() {
       Connection connection = null;
       try {
           connection = DriverManager.getConnection(URL, properties);
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return connection;
   }
   ```
   
   
 
#### 方式二：使用JDBC负载均衡方式连接集群（推荐）
1. 获取内网IP。打开控制台指定集群拓扑页面，获取CN的内网IP，详情请参见[获取DWS集群连接地址](https://support.huaweicloud.com/mgtg-dws/dws_01_0033.html)。
2. 配置驱动。请参见[下载JDBC或ODBC驱动](https://support.huaweicloud.com/mgtg-dws/dws_01_0032.html)。使用JDBC负载均衡方式连接集群方式驱动从8.3.1.200版本开始支持，如果使用此方式连接集群，需确认JDBC驱动版本是否升级到8.3.1.200及以上版本。
   
   ```
   <dependency> 
       <groupId>com.huaweicloud.dws</groupId>  
       <artifactId>huaweicloud-dws-jdbc</artifactId>   
       <version>8.5.1</version> 
   </dependency>
   ```
   
   
3. 获取数据库连接。URL参数配置请参见[使用JDBC连接](https://support.huaweicloud.com/mgtg-dws/dws_01_0077.html)。
   
   ```
   private static final String USER_NAME = "dbadmin";
   private static final String PASSWORD = "password";
   // jdbc:postgresql://host1:port1,host2:port2/dbName"
   private static final String URL = "jdbc:postgresql://192.160.0.10:8000,192.168.0.11:8000,192.168.0.12:8000/gaussdb?loadBalanceHosts=true&cnListRefreshSwitch=on&cnListRefreshDelay=100000&cnListRefreshPeriod=5000
   ;
   private static Properties properties = new Properties();
   static {
       properties.setProperty("user", USER_NAME);
       properties.setProperty("password", PASSWORD);
   }
   /**
    * 获取数据库连接
    */
   public static Connection getConnection() {
       Connection connection = null;
       try {
           connection = DriverManager.getConnection(URL, properties);
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return connection;
   }
   ```
   
   
 
#### 方式三：使用multi-host方式连接集群
1. 获取公网IP。打开控制台指定集群详情页面，获取弹性公网IP。
2. 配置驱动。请参见[下载JDBC或ODBC驱动](https://support.huaweicloud.com/mgtg-dws/dws_01_0032.html)。
   
   ```
   <dependency> 
       <groupId>com.huaweicloud.dws</groupId>  
       <artifactId>huaweicloud-dws-jdbc</artifactId>   
       <version>8.5.1</version> 
   </dependency>
   ```
   
   
3. 获取数据库连接。 
   ```
   private static final String USER_NAME = "dbadmin";
   private static final String PASSWORD = "password";
   // jdbc:postgresql://host1:port1,host2:port2/dbName"
   private static final String URL = "jdbc:postgresql://192.160.0.10:8000,192.168.0.11:8000,192.168.0.12:8000/gaussdb?loadBalanceHosts=true";
   private static Properties properties = new Properties();
   static {
       properties.setProperty("user", USER_NAME);
       properties.setProperty("password", PASSWORD);
   }
   /**
    * 获取数据库连接
    */
   public static Connection getConnection() {
       Connection connection = null;
       try {
           connection = DriverManager.getConnection(URL, properties);
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return connection;
   }
   ```
   
   
 
