连接 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 类型,表示是否开启负载均衡,可选参数,默认值为 false,表示关闭。 2.00.11.0 版本开始支持。

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

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

注意:

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

    boolean success = conn.connect("localhost", 8848, "admin", "123456");
  • 若需要开启 API 高可用,则须设置 highAvailability=true。2.00.11.0 版本之前,开启高可用模式即开启负载均衡模式;自 2.00.11.0 版本起,connect 方法新增参数 enableLoadBalance,用户可手动关闭高可用模式下的负载均衡功能,且该功能默认为关闭。

    • 以下为同时开启高可用模式和负载均衡功能的情况:
      • 1.30.22.1 及之前版本的 API 将随机选择一个可用节点进行连接;用户也可以通过 highAvailabilitySites 指定可连接的节点组,此时 API 将从 highAvailabilitySites 中随机选择可用节点进行连接。
      • 1.30.22.2 版本起,API 将优先选择低负载节点,判断标准为:内存占用小于 80%、连接数小于 90% 且节点负载小于 80%。即在开启高可用后,API 将优先随机选择一个低负载节点进行连接,若没有低负载节点,则将随机连接一个可用节点。若用户通过 highAvailabilitySites 指定了可连接的节点组,此时 API 将仍优先从 highAvailabilitySites 中随机连接一个低负载节点,若无,则随机选择一个 highAvailabilitySites 中的可用节点。

    注意:若 API 断开重连,将按照上述规则重新连接节点。

    示例如下:

    仅开启高可用模式,此时会开启负载均衡功能。

 sites=["192.168.1.2:24120", "192.168.1.3:24120", "192.168.1.4:24120"]
 boolean success = conn.connect("192.168.1.2", 24120, "admin", "123456", highAvailability=true, highAvailabilitySites=sites);

开启高可用模式,同时手动开启负载均衡功能。

 boolean success = conn.connect("192.168.1.2", 24120, "admin", "123456", enableHighAvailability=true, highAvailabilitySites=sites, enableLoadBalance);
  • 若开启高可用模式、同时不开启负载均衡功能:API 将优先从 highAvailabilitySites 中随机选择一个可用节点进行连接。若未设置 highAvailabilitySites,则将随机选择一个集群中的节点。

  • 注意:不支持仅开启负载均衡功能的情况。

  • 开启高可用后,即设置 enableHighAvailability 为 true 时,reconnect 会默认设置始终为 true。在关闭高可用后才可以任意配置 reconnect 的值。

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

    • 无需在每次执行脚本时重复定义该函数。
    • Java API 提供自动重连机制,断连之后重连会产生新的会话。如果 initialScript 不为空,Java API 将会在新的会话中自动执行初始化脚本重新注册后面脚本中需要用到的函数和变量。

返回值

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

使用示例

以下示例为创建一个 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);
}

报错说明

  • 若用户名 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 端的错误,需要您检查下使用的脚本。