连接池 SimpleDBConnectionPool

Java API 自 2.00.11.1 版本起提供 SimpleDBConnectionPool 连接池,以此对连接进行管理和重用。

在使用时,先通过 SimpleDBConnectionPoolConfig 设置连接池的具体参数,然后在构造连接池时,将 SimpleDBConnectionPoolConfig 作为 SimpleDBConnectionPool 的配置参数。SimpleDBConnectionPool 将根据传递的参数进行解析、初始化连接等操作。连接池创建成功后,用户可以通过 getConnection 方法获取一个连接进行使用。使用完毕后,用户可通过 DBConnection.close() 释放连接。连接重回连接池后属于闲置状态,之后可以再次被获取使用。

使用说明

SimpleDBConnectionPoolConfig 仅可通过 setXxx 方法来配置参数,示例如下:

SimpleDBConnectionPoolConfig config = new SimpleDBConnectionPoolConfig();
        config.setHostName("1sss");
        config.setPort(PORT);
        config.setUserId("admin");
        config.setPassword("123456");
        config.setminimumPoolSize(6);
        config.setEnableHighAvailability(false);

目前 SimpleDBConnectionPoolConfig 支持的参数如下

hostName IP,默认为 localhost。

port 端口,默认为 8848。

userId 用户名,默认为””。

password 密码,默认为””。用户名和密码仅填写其中一个,创建连接不登录;用户名和密码填写正确,创建连接且登录;用户名和密码填写错误,创建连接失败。

minimumPoolSize 表示连接池中最小连接数,正整数,默认值为 5。

  • 若填写 minimumPoolSize ,则以 minimumPoolSize 值为准来作为初始化连接数。
  • 若两个参数都不填写,则取 minimumPoolSize 的默认值 5 来作为初始化连接数。

maximumPoolSize 表示连接池中允许同时存在的最大连接数,正整数,默认值为 5。该参数用来设置连接池的上限,以防止数据库连接数过多而导致可用连接数耗尽。

注意:maximumPoolSize 必须大于等于 minimumPoolSize

idleTimeout 表示连接在连接池中保持空闲状态的最长时间,超时后将被回收,即连接被关闭。该参数以毫秒为单位,默认值为 600000(即 10 分钟);最小值为 10000(即 10 秒),若小于该值则会抛异常。

空闲连接回收机制说明:针对当前连接池中 minimumPoolSize 数量之外的连接,若其处于空闲状态,则在超过 idleTimeout 时间后将被回收关闭。

initialPoolSize 表示连接池的初始连接数,默认为 5。

兼容性说明:自 3.00.1.1 版本起,该参数不再推荐使用,请使用 minimumPoolSizemaximumPoolSize 代替,以进行连接池的初始化。若同时设置 initialPoolSizeminimumPoolSizemaximumPoolSize,则以 minimumPoolSizemaximumPoolSize 的值为准。

initialScript 表示初始化的脚本,默认为空。

compress 表示是否在下载时对数据进行压缩,默认值为 false。该模式适用于大数据量的查询。压缩数据后再传输,这可以节省网络带宽,但会增加 DolphinDB、API 的计算量。

useSSL 表示是否使用 SSL 连接,默认值为 false。注意:若要开启 SSL 连接,服务器端的配置文件(如果是单节点为 dolphindb.cfg,如果是集群为 cluster.cfg)须同时配置功能参数 enableHTTPS=true

usePython 表示是否开启 Python 解析,默认值为 false。

loadBalance 表示是否开启负载均衡,默认为 false,为 true 时注意:

  • 如果未指定highAvailabilitySites,Java API 会对 server 集群的所有节点采取轮询策略的负载均衡。
  • 如果指定了highAvailabilitySites ,Java API 将对 highAvailabilitySites 数组中的连接节点执行轮询策略的负载均衡。

enableHighAvailability 表示是否开启高可用,默认为 false。

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

tryReconnectNums 表示连接池中每个连接的重连尝试次数,int 类型。使用方式如下:

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

相关方法

方法名详情
SimpleDBConnectionPool(simpleDBConnectionPoolConfig)构造方法
DBConnection getConnection()从连接池中获取一个连接
close()关闭连接池
isClosed()查看连接池是否关闭
getActiveConnectionsCount()获取当前使用中的连接数
getIdleConnectionsCount()获取当前空闲的连接数
getTotalConnectionsCount()获取总连接数
DBConnection.close()释放当前连接
getConnection()获取一个空闲连接
manualCleanupIdleConnections()关闭空闲连接

注意:该处的 DBConnection.close() 方法区别于 DBConnection 类中关闭当前会话的功能,此处仅用于将使用 getConnection 获取的连接释放到连接池。

使用示例

// 设置连接池参数
SimpleDBConnectionPoolConfig config = new SimpleDBConnectionPoolConfig();
        config.setHostName("1sss");
        config.setPort(PORT);
        config.setUserId("admin");
        config.setPassword("123456");
        config.setInitialPoolSize(5);
        config.setEnableHighAvailability(false);
 
// 初始化连接池       
SimpleDBConnectionPool pool = new SimpleDBConnectionPool(config);

// 从连接池中获取一个连接
DBConnection conn = pool.getConnection();
conn.run("..."); // 执行脚本

// 释放当前连接
conn.close();

// 获取当前使用中的连接数
int activeConns = pool.getActiveConnectionsCount();

// 获取当前空闲的连接数
int idleConns = pool.getIdleConnectionsCount();

机制介绍

(1) 空闲连接获取机制

若当前连接池:

  • 有空闲连接,则返回一个空闲连接。
  • 无空闲连接、且池中总连接数大于 minimumPoolSize 且小于 maximumPoolSize,则创建一个新的连接并返回。
  • 无空闲连接、且池中总连接数达到 maximumPoolSize,则会抛出异常。

(2) 空闲连接释放机制

调用 close() 方法释放连接,则状态将由使用状态变为空闲状态。

(3) 空闲连接回收机制

区别于释放连接,回收连接即是将连接由空闲状态变为关闭状态。Java API 提供自动和手动两种回收机制,以下分别进行详细说明。

连接池内部的自动回收机制:

在回收连接之前,连接池会检查当前的连接数量。如果当前池中的连接数量:

  • 大于 minimumPoolSize,则多余的空闲连接将被回收。
  • 等于或少于 minimumIdle,即使连接的空闲时间已经超过了 idleTimeout,连接也不会被回收。

用户手动回收机制:

Java API 提供手动关闭空闲连接的方法 manualCleanupIdleConnections()。在回收连接之前,连接池会检查当前的连接数量。如果连接数量大于 minimumPoolSize,则当前池中多余的空闲连接将被回收。

注意,用户手动回收的方式,不受 idleTimeout 参数的影响。