构造 DBConnectionPool

DBConnectionPool (连接池)可以实现并发执行脚本。由前一章节的内容可知,session(会话控制)可以实现 API 客户端与 DolphinDB 之间的信息交互。Python API 通过 session 在 DolphinDB 上执行脚本和函数,同时实现双向的数据传递。但由于 session 只能调用 run() 方法来串行执行脚本,且无法在多线程中使用同一 session 执行脚本。因此,若需要并发地执行脚本,建议使用 DBConnectionPool 以提高任务运行的效率。

DBConnectionPool 通过创建多个线程以实现并发执行任务。如下展示创建一个 DBConnectionPool 的完整示例:

DBConnectionPool(host, port, threadNum=10, userid=None, password=None, 
                 loadBalance=False, highAvailability=False, compress=False,  
                 reConnect=False, python=False, protocol=PROTOCOL_DEFAULT,
                 show_output=True)

通过调用方法函数 getSessionId() 来获取 DBConnectionPool 对象创建的所有线程会话的 session id。若不再使用当前 DBConnectionPool,API 会在析构时自动释放连接。

以下内容将对创建 DBConnectionPool 的相关参数进行详细说明。

连接参数 host, port, threadNum, userid, password

  • host :所连接服务器的地址。
  • port :所连接服务器的端口。
  • threadNum :建立连接的数量,默认为10。
  • userid :登录时的用户名。
  • password :登录时用户名对应的密码。

用户可以使用指定的域名(或 IP 地址)和端口号把 DBConnectionPool 连接到 DolphinDB,并且在建立连接的同时登录账号。使用示例如下:

import dolphindb as ddb

# 连接地址为localhost,端口为8848的DolphinDB,连接数为10
pool = ddb.DBConnectionPool("localhost", 8848)

# 连接地址为localhost,端口为8848的DolphinDB,登录用户名为admin,密码为123456的账户,连接数为8
pool = ddb.DBConnectionPool("localhost", 8848, 8, "admin", "123456")

注意

  • 在构造 DBConnectionPool 时,必须指定参数 host, port

负载均衡参数 loadBalance

  • loadBalance:连接池负载均衡相关配置参数,默认值为 False。

该参数的默认值为 False,表示不开启负载均衡。若要开启负载均衡,则将参数设置为 True。示例脚本如下:

import dolphindb as ddb

# 创建连接池;开启负载均衡
pool = ddb.DBConnectionPool("localhost", 8848, 8, loadBalance=True)

注意,在负载均衡模式下:

  • 如果开启高可用,则可连接节点为集群中所有数据节点。此时负载均衡参数无效。
  • 如果不开启高可用模式,则 DBConnectionPool 会向所有可连接的数据节点均匀建立连接。例如,集群中有 3 个节点,当前连接数分别为[5, 12, 13],DBConnectionPool 的连接数为 6,则在建立连接后,集群中 3 个节点的连接数分别为[7, 14, 15],即每个节点均增加 2 个连接数。

高可用参数 highAvailability

  • highAvailability :是否在集群所有节点上进行高可用配置,默认值为 False。

在高可用模式下,如果不启用负载均衡模式,DBConnectionPool 会和当前集群中负载最小的节点建立连接。但由于 DBConnectionPool 中的连接为同时建立,每个连接计算出的负载值几乎一致,导致所有连接会和同一个节点建立连接,故无法保证节点资源的负载均衡。

示例脚本如下:

import dolphindb as ddb

# 创建连接池;开启高可用,使用集群所有节点作为高可用节点
pool = ddb.DBConnectionPool("localhost", 8848, 8, "admin", "123456", highAvailability=True)

压缩参数 compress

  • compress:当前连接是否开启压缩,默认参数为 False。

该模式适用于大数据量的写入或查询。压缩数据后再传输,这可以节省网络带宽,但会增加 DolphinDB 和 API 端的计算量。使用示例如下:

import dolphindb as ddb
import dolphindb.settings as keys

# api version >= 1.30.21.1,开启压缩,需指定协议为PROTOCOL_DDB
pool = ddb.DBConnectionPool("localhost", 8848, 8, compress=True, protocol=keys.PROTOCOL_DDB)

# api version <= 1.30.19.4,开启压缩,默认使用协议为PROTOCOL_DDB,即enablePickle=False
pool = ddb.DBConnectionPool("localhost", 8848, 8, compress=True)

注意

  • DolphinDB 自1.30.6版本起支持压缩参数 compress
  • 目前仅在配置协议参数 protocol 为 PROTOCOL_DDB 的情况下支持开启压缩。(API version<=1.30.19.4 时,默认协议使用PROTOCOL_DDB,支持开启压缩)

重连参数 reconnect

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

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

import dolphindb as ddb

# 创建连接池;开启重连
pool = ddb.DBConnectionPool("localhost", 8848, 8, reconnect=True)

协议参数 protocol

  • protocol:API 与 DolphinDB 交互时使用的数据格式协议,默认值为 PROTOCOL_DEFAULT,表示使用 PROTOCOL_PICKLE。

目前 DolphinDB 支持三种协议:PROTOCOL_DDB, PROTOCOL_PICKLE, PROTOCOL_ARROW。使用不同的协议,会影响 API 执行 DolphinDB 脚本后接收到的数据格式。有关协议的详细说明请参考章节类型转换

import dolphindb.settings as keys

# 使用协议 PROTOCOL_DDB
pool = ddb.DBConnectionPool("localhost", 8848, 10, protocol=keys.PROTOCOL_DDB)

# 使用协议 PROTOCOL_PICKLE
pool = ddb.DBConnectionPool("localhost", 8848, 10, protocol=keys.PROTOCOL_PICKLE)

# 使用协议 PROTOCOL_ARROW
pool = ddb.DBConnectionPool("localhost", 8848, 10, protocol=keys.PROTOCOL_ARROW)

注意:在 1.30.21.1 版本及之后,API 支持使用 protocol 来指定数据格式协议。1.30.19.4 版本及之前,默认 API 内部使用 PROTOCOL_DDB,即 enablePickle=False

其他参数 show_output

  • show_output:是否在执行后打印脚本中 print 语句的输出。默认值为 True,表示打印 print 语句输出。

使用示例如下:

# 启用 show_output
pool = ddb.DBConnectionPool("localhost", 8848, 8, show_output=True)
taskid = 12
pool.addTask("print(1);2", taskId=taskid)
while True:
    if pool.isFinished(taskId=taskid):
        break
    time.sleep(0.01)

res = pool.getData(taskId=taskid)
print(res)

# output:
1
2


# 不启用 show_output
pool = ddb.DBConnectionPool("localhost", 8848, 8, show_output=False)
taskid = 12
pool.addTask("print(1);2", taskId=taskid)
while True:
    if pool.isFinished(taskId=taskid):
        break
    time.sleep(0.01)

res = pool.getData(taskId=taskid)
print(res)

# output:
2

其他参数 python

  • python:是否启用 python parser 特性。

指定该参数后,可以在 DBConnectionPool.run 执行脚本时启用 python parser 特性.使用示例如下:

import dolphindb as ddb

# 启用 python parser 特性
pool = ddb.DBConnectionPool("localhost", 8848, 10, python=True)

注意: 仅支持 DolphinDB 3.00 版本。(暂未发布,敬请期待)