连接 connect

本文将介绍连接数据库的方法 connect 的参数、返回值和使用示例。

以下为使用连接方法 connect 的完整语法。

public boolean connect(String hostName, int port, String userId, String password, String initialScript, boolean enableHighAvailability, String[] highAvailabilitySites, boolean reconnect, boolean enableLoadBalance, int tryReconnectNums)

参数介绍

hostName String 类型,表示主机名。

port int 类型,表示端口。

timeout int 类型,表示超时时间,可选参数,单位为 ms,默认值为 3000。
Note:
  • 该参数同时设置了 API 底层 Socket 连接等待 server 响应的最大时间和等待 server 返回数据的最大时间。
  • 自 3.00.1.3 版本起,新增参数 connectTimeout 和 readTimeout(详见对应参数介绍),若与参数 timeout 同时设置,则优先取新参数的值。

connectTimeout int 类型,表示 API 底层的 Socket 连接等待 server 响应的最大时间,可选参数,单位为 ms,默认值 3000 ms。

readTimeout int 类型,表示 API 底层的 Socket 连接等待 server 返回数据的最大时间,可选参数,单位为 ms,默认值为 0。

userId String 类型,表示登录的用户名,可选参数,默认值为 ”” 。

password String 类型,表示登录的密码,可选参数,默认值为空。

initialScript String 类型,表示初始化脚本,可选参数,默认值为空。

enableHighAvailability boolean 类型,表示是否开启高可用,可选参数,默认值为 false,表示关闭。

highAvailabilitySites String 数组类型,表示开启高可用情况下指定填入的主机名和端口号数组,可选参数,默认值为 null。

reconnect boolean 类型,表示是否开启单节点断连后自动重连,可选参数,默认值为 false,表示关闭。注意:该参数的使用与 enableHighAvailability 的配置有关,详见后文说明。

enableLoadBalance boolean 类型,表示是否开启负载均衡,可选参数。仅可在开启高可用时设为 true;开启高可用时默认同时开启负载均衡,可显式设为 false 关闭。 2.00.11.0 版本开始支持。

tryReconnectNums 表示重连尝试次数,int 类型。使用方式如下:

  • 若不开启高可用,须与 reconnect 参数搭配使用,对单节点进行有限次重连。若不填写该参数,默认进行无限重连。
  • 当开启 enableHighAvailability 高可用参数时,
    • 若指定该参数,将在断开连接后遍历高可用范围内的每个节点进行有限次重连。一次遍历中,每个节点只会被重连一次,最多进行 tryReconnectNums 次遍历尝试。
    • 若不填写该参数,默认是无限重连。

注意:

  • 若调用 connect 方法时未填写 userId 和 password 参数,则该脚本将在 Guest 权限下运行。用户若需要使用管理员权限,可以在 connect 时填写管理员账户的 userId 和 password 参数,或者使用下一节将介绍的 login 方法。

    boolean success = conn.connect("localhost", 8848, "admin", "123456");
  • 设置 enableHighAvailability=true 开启高可用后,API 按以下规则选择节点:

    • 候选节点:
      • 已设置 highAvailabilitySites:候选节点为入口节点(hostName 和 port 指定的节点)和数组中的节点。
      • 未设置 highAvailabilitySites:
        • 开启负载均衡:候选节点为入口节点,以及 getClusterPerf 返回的数据节点。
        • 关闭负载均衡:候选节点为入口节点,以及 getClusterPerf 返回的数据节点和计算节点。
    • 首次连接:
      • 开启负载均衡:首先按入口节点、highAvailabilitySites 中节点的顺序尝试建立连接。成功连接并获取集群信息后,优先从候选节点中符合低负载条件的数据节点里随机选择;如果没有符合条件的数据节点,则从候选节点中随机选择。选中的节点与当前连接节点不同时,会尝试切换。低负载条件为同时满足内存使用率小于 80%、连接数占上限的比例小于 90%、CPU 平均负载小于 0.8。候选节点中的计算节点不参与低负载筛选,但仍可能在随机选择或重连时被连接。
      • 关闭负载均衡:首先尝试连接入口节点;如果入口节点连接失败且指定了 highAvailabilitySites,会按数组顺序尝试其他节点。连接成功后,不再根据节点负载主动切换。
    • 断线重连:高可用模式下会自动重连。连接中断后,从已有候选节点中随机选择节点重连;部分异常(如函数调用或上传时发生读取超时)会先尝试重连原节点,失败后再随机选择。重连时不会重新获取集群节点或评估负载。随机选择时,数据节点和计算节点没有优先级之分。reconnect 仅在关闭高可用时控制单节点重连。
  • 自 1.30.22.2 版本起支持上述低负载选择;1.30.22.1 及之前版本随机连接可用节点。

  • 当需要在应用程序里定义和使用自定义函数时,可以使用 initialScript 传入函数定义脚本。这样做的好处是:

    • 无需在每次执行脚本时重复定义该函数。
    • Java API 提供自动重连机制,断连之后重连会产生新的会话。如果 initialScript 不为空,Java API 将会在新的会话中自动执行初始化脚本重新注册后面脚本中需要用到的函数和变量。
  • 自 3.00.2.6 版本起,DBConnection.connect 方法支持通过 ConnectConfig 配置连接参数,提供更灵活的参数设置方式。具体用法请参见下方示例。

返回值

返回布尔值,表示连接是否成功。

使用示例

以下示例为创建一个 DBConnection 并进行 connect 操作。

首先创建连接对象,并指定高可用节点数组。然后进行连接操作,传入指定 hostName, port, userId 和 password;本例中初始化脚本参数 initialScript 为clearAllCache(),表示清除缓存数据,包含分区表中已经载入内存的数据和分布式计算中 map-reduce 任务的中间结果;同时开启高可用和自动重连功能。

@Test
public void testConnect() throws IOException {
    DBConnection dbConnection = new DBConnection();
    String[] highAvailabilitySites = new String[]{"192.168.1.167:18921", "192.168.1.167:18922", "192.168.1.167:18923"};
    boolean success = dbConnection.connect("192.168.1.167", 18921, "admin", "123456", "clearAllCache();", true, highAvailabilitySites, true);
    System.out.println("connect result: " + success);
}

通过 ConnectConfig 配置参数的示例如下:

@Test
public void testConnect() throws IOException {
    DBConnection dbConnection = new DBConnection();
    DBConnection.ConnectConfig connectConfig = DBConnection.ConnectConfig.builder()
            .hostName("192.168.1.167")
            .port(18921)
            .userId("admin")
            .password("123456")
            .initialScript("clearAllCache();")
            .enableHighAvailability(true)
            .highAvailabilitySites(new String[]{"192.168.1.167:18921", "192.168.1.167:18922", "192.168.1.167:18923"})
            .build();
    dbConnection.connect(connectConfig);
}

报错说明

  • 若用户名 userId 或密码 password 填写错误,报错描述如下:

    java.io.IOException: 192.168.1.167:18921
    Server response: 'RemoteRun[ctl18920] The user name or password is incorrect.' function: 'login'

    此类报错比较明确,在发送到 server 端进行校验时,出现用户名或密码报错。

  • 若目标 server IP 或者 port 填错出错,报错描述如下:

    java.net.SocketException: Connection reset

    如上,会报 'SocketException';如果您 connect 的过程中出现此类报错,建议优先查看 IP、port 等配置;

  • 若 initialScript 脚本编写有问题,例如:写了一个未定义变量 x,报错描述如下:

    java.io.IOException: 192.168.1.167:18922 Server response: 'Syntax Error: [line #1] Cannot recognize the token x' script: 'x'

    如上述报错所示,如果异常以hostName_+":"+port_+" Server response: 'Syntax Error'.'"开头,则是 server 端的错误,需要您检查下使用的脚本。