更新时间:2026-09-23 GMT+08:00
分享

配置JDBC连接(使用负载均衡方式)

功能介绍

使用JDBC连接集群时,如果只配置一个CN的地址,所有业务流量都会集中到该CN上,导致单个CN压力较大、其他CN资源闲置,同时还存在单点故障风险,一旦该CN发生故障,连接将不可用,影响业务连续性。为避免上述问题,推荐使用负载均衡方式连接多个CN,将连接请求分发到不同CN上,降低单点压力并提升连接的可用性。主要有以下三种方式:

  • 使用ELB连接集群(推荐):弹性负载均衡(ELB)是将访问流量根据转发策略分发到后端多台弹性云服务器的流量分发控制服务,可以通过流量分发扩展应用系统对外的服务能力,提高应用程序的容错能力。
  • 使用JDBC负载均衡连接集群(推荐):开启JDBC驱动自身的负载均衡能力,URL需要配置至少一个CN节点内网IP,之后会自动扫描所有的CN节点IP,JDBC负载均衡可以使连接随机到其中一个CN,从而实现类似ELB的效果。
  • 使用multi-host方式连接集群:使用JDBC手动配置多个节点地址的方式,也能实现类似ELB的效果。

负载均衡三种方式区别

三种方式的区别如下所示,请结合业务场景选择:

表1 负载均衡三种方式区别说明

对比项

方式一:ELB连接

方式二:JDBC负载均衡

方式三:multi-host

实现原理

ELB将流量按策略分发到后端多个CN

驱动自动扫描全部CN,随机分发连接

URL中手动配置多个CN,驱动自动选择可用节点

是否依赖ELB服务

是,需创建并绑定ELB

否

否

JDBC驱动版本要求

无特殊要求

8.3.1.200及以上版本

无特殊要求

URL配置复杂度

低,仅需ELB地址

低,配置至少1个CN内网IP即可自动扫描全部CN

较高,需手动配置每个CN的IP和端口

CN列表自动刷新

不支持

支持(cnListRefreshSwitch)

不支持

适用场景

业务流量大、需统一入口和容灾能力

无ELB依赖、希望自动感知CN节点变更

需手动控制连接节点列表

约束与限制

示例代码使用系统管理员dbadmin建立连接。dbadmin拥有集群最高权限,可执行所有管理操作。日常业务运行建议创建独立业务用户并仅授予所需的最小权限(参见创建DWS数据库用户和角色),避免因权限过大带来安全风险。

  • 使用JDBC负载均衡方式连接集群,JDBC驱动版本需为8.3.1.200及以上版本,请先确认本地驱动版本满足要求。
  • 本文示例中的IP地址、端口号、数据库名称均为示例值,实际使用时请替换为集群真实的连接地址和数据库名称,配置错误将导致连接失败。
  • 通过内网IP连接集群时,客户端与集群需处于同一VPC(虚拟私有云)内,保证网络互通。

方式一:使用ELB连接集群(推荐)

  1. 登录DWS管理控制台。
  2. 在左侧导航栏中,选择 “集群 > 集群列表”。
  3. 获取弹性负载均衡地址。单击指定集群名称,进入集群详情页面,获取弹性负载均衡IP,绑定弹性负载均衡请参见集群绑定和解绑ELB。
  4. 配置驱动,请参见下载JDBC或ODBC驱动。在Maven工程的pom.xml中添加以下依赖:

    1
    2
    3
    4
    5
    <dependency> 
        <groupId>com.huaweicloud.dws</groupId>  
        <artifactId>huaweicloud-dws-jdbc</artifactId>   
        <version>8.5.1</version> 
    </dependency>
    

  5. 获取数据库连接,使用ELB方式连接时,URL中仅需配置ELB的IP和端口。参考示例代码如下所示,请将示例中的192.160.xx.xx:8000替换为实际获取的弹性负载均衡IP和数据库端口。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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.xx.xx: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;
    }
    

  6. 连接成功后,可通过以下方式验证:

    • 程序调用getConnection()方法后返回Connection对象且未抛出异常。
    • 通过该连接执行以下语句能正常返回数据库版本信息。
      select version();

方式二:使用JDBC负载均衡方式连接集群(推荐)

  1. 登录DWS管理控制台。
  2. 在左侧导航栏中,选择 “集群 > 集群列表”。
  3. 获取内网IP。单击指定集群名称,进入集群详情页面,切换至“集群拓扑”页签,获取CN的内网IP,详情请参见获取DWS集群连接地址。
  4. 配置驱动,请参见下载JDBC或ODBC驱动。JDBC负载均衡方式自驱动从8.3.1.200版本起支持,请先确认JDBC驱动版本已升级至8.3.1.200及以上版本(本文示例使用8.5.1版本)。在Maven工程的pom.xml中添加以下依赖:

    1
    2
    3
    4
    5
    <dependency> 
        <groupId>com.huaweicloud.dws</groupId>  
        <artifactId>huaweicloud-dws-jdbc</artifactId>   
        <version>8.5.1</version> 
    </dependency>
    

  5. 获取数据库连接,URL中配置至少一个CN的内网IP后,驱动会自动扫描并获取集群全部CN的IP地址,URL参数配置请参见表2。参考示例代码如下所示,请将URL中的IP和端口替换为3中获取的CN内网IP和数据库端口。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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;
    }
    
    表2 JDBC URL参数说明

    参数

    含义

    默认值

    设置建议

    loadBalanceHosts

    是否开启JDBC负载均衡。开启后,驱动每次新建连接时随机分发到已配置的CN节点。

    false

    使用负载均衡方式连接时设置为true。

    cnListRefreshSwitch

    是否开启自动感知CN存活列表。开启后,驱动会周期性重新获取集群CN列表,集群发生CN节点变更时自动更新连接列表。

    off

    集群CN节点可能发生变更(如扩缩容)时建议设置为on。

    cnListRefreshDelay

    设置自动感知CN存活列表的延迟时间(毫秒)。驱动启动后延迟该时长再执行首次刷新。当“cnListRefreshSwitch=on”时生效。

    1800000

    可根据驱动启动后至业务首次建连的时间间隔设置。

    cnListRefreshPeriod

    设置自动感知CN存活列表的时间周期(毫秒)。驱动每隔该时长刷新一次CN列表。当“cnListRefreshSwitch=on”时生效。

    1800000

    集群CN节点变更频繁时可适当调小,以更快感知变更。

  6. 连接成功后,可通过以下方式验证:

    • 程序调用getConnection()方法后返回Connection对象且未抛出异常。
    • 通过该连接执行以下语句能正常返回数据库版本信息。
      select version();

方式三:使用multi-host方式连接集群

  1. 登录DWS管理控制台。
  2. 在左侧导航栏中,选择 “集群 > 集群列表”。
  3. 获取弹性公网IP。单击指定集群名称,进入集群详情页面,获取弹性公网IP。
  4. 配置驱动,请参见下载JDBC或ODBC驱动。在Maven工程的pom.xml中添加以下依赖:

    1
    2
    3
    4
    5
    <dependency> 
        <groupId>com.huaweicloud.dws</groupId>  
        <artifactId>huaweicloud-dws-jdbc</artifactId>   
        <version>8.5.1</version> 
    </dependency>
    

  5. 获取数据库连接。参考示例代码如下所示,请将URL中的IP和端口替换为实际获取的CN节点IP和数据库端口。multi-host方式需手动配置多个CN节点地址,地址间以英文逗号分隔。URL参数loadBalanceHosts=true表示开启负载均衡,将连接随机分发到各CN节点。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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;
    }
    

  6. 连接成功后,可通过以下方式验证:

    • 程序调用getConnection()方法后返回Connection对象且未抛出异常。
    • 通过该连接执行以下语句能正常返回数据库版本信息。
      select version();

相关文档

相关文档