连接数据库

API 提供 DBConnection::connect 方法以连接数据库,该方法的声明如下:

bool connect(
    const std::string& hostName,
    int port,
    const std::string& userId = "",
    const std::string& password = "",
    const std::string& initialScript = "",
    bool highAvailability = false,
    const std::vector<std::string>& highAvailabilitySites = {},
    int keepAliveTime = -1,
    bool reconnect = false);

参数说明如下:

连接参数

  • hostName:所连接服务器的地址。
  • port:所连接服务器的端口。
  • userId:登录时的用户名,默认值为空。
  • password:登录时用户名对应的密码,默认值为空。

通过上述参数,用户可以连接到指定的IP地址和端口号上面的 DolphinDB,如果userId和password不为空,则在建立连接的同时登录账号。

脚本参数

initialScript:初始化脚本,在连接成功后会调用一次 。

该参数可以用于执行一些预加载任务。包含加载插件、加载分布式表、定义并加载流数据表等脚本。

高可用参数

  • highAvailability:是否开启 API 高可用,默认值为 False。
  • highAvailabilitySites:由所有可用节点的地址和端口组成的 vector,每个节点的格式为 ip:port。

highAvailability 和 highAvailabilitySites 都是 API 高可用的相关配置参数。在高可用模式下,C++ API 在连接集群节点时会查询负载最小的节点,并与其建立连接。当使用单线程方式有一定延迟地(如下注意中的第一点)创建多个连接时,C++ API 可以保证所有可用节点上连接的负载均衡;但在使用多线程方式同时创建多个连接时,由于同时建立连接,每个 Session 建立时查询的最小负载节点可能为同一个,不能保证节点的负载均衡。

Note:
  • 如果连续建立多个 Session,服务端集群间可能尚未同步负载信息,此时查询到的结果可能始终为同一个最小负载节点,无法保证节点的负载均衡。
  • 若开启高可用后不指定 highAvailabilitySites,则默认高可用组为集群全部节点。
  • 开启高可用相当于启用自动重连,当连接断开时,如果返回的错误信息为 <NotLeader> 则继续尝试重连错误信息中指定的 Leader 节点;如果返回的错误信息为其他,则尝试重连 highAvailabilitySites 列表中上一次成功连接的节点的下一个节点。

保活参数

keepAliveTime:表示在 TCP 连接空闲状态下,两次保活包之间的间隔时间,默认值为 -1。设置为 -1 或 0 时保留对象当前的保活配置;设置为正数则按此值更新保活时间;设置为除 -1 外的负数会报错。

该参数与 DBConnection 构造函数中的 keepAliveTime 参数作用相同。

Note:
  1. 该参数在 Linux、Windows、MacOS 平台均可生效。
  2. 在构造DBConnect对象时也可以设置该参数。

重连参数

reconnect:表示在不开启高可用的情况下,是否在 API 检测到连接异常时进行重连,默认值为 false。

若开启高可用模式,则 API 在检测到连接异常时将自动进行重连,不需要设置参数 reconnect;若未开启高可用,通过配置 reconnect = true,即可实现 API 在检测到连接异常时进行重连。

设置建连超时方法

void setNetTimeout(int timeoutMs);

设置建连和重连的 TCP 建连超时。

参数说明:

  • timeoutMs 正数,指定建连超时值,单位为毫秒。

示例:将建连超时设置为 10 秒。由于默认保活时间为 30 秒,调用 setNetTimeout(10000) 后当前保活时间会缩短为 10 秒。

#include "DolphinDB.h"

using namespace dolphindb;

DBConnection conn;
conn.setNetTimeout(10'000); // 单位:毫秒
if (!conn.connect("127.0.0.1", 8848, "admin", "123456")) {
    throw RuntimeException("Failed to connect to DolphinDB server.");
}
Note:

Linux 平台会配置 TCP keepalive 和 TCP_USER_TIMEOUT。Windows 平台通过 SIO_KEEPALIVE_VALS 配置首次探测等待时间和探测间隔,但探测次数由操作系统固定;因此 Windows 上的实际断连检测时间可能略长于配置值。

用法示例

conn.connect("127.0.0.1", 8848, "admin", "123456"); //连接IP地址为127.0.0.1,端口为8848的DolphinDB并登录,用户名为"admin",密码为"123456" 
conn.connect("127.0.0.1", 8848, "admin", "123456", "clearAllCache();");  //连接数据库,并执行初始化脚本"clearAllCache();"
std::vector<std::string> sites{"192.168.1.2:24120", "192.168.1.3:24120", "192.168.1.4:24120"};  //开启高可用,连接由三台DolphinDB节点组成的集群
conn.connect("192.168.1.2", 24120, "admin", "123456", "", true, sites);
conn.connect("127.0.0.1", 8848, "admin", "123456", "", false, std::vector<std::string>{}, 30, true);  //连接单节点数据库,设置保活包间隔为30秒,并开启自动重连