Docs 菜单
Docs 主页
/ / /
C 驱动程序
/ /

连接池化

在此页面上

  • 单模式
  • 池化模式

MongoDB C 驱动程序有两种连接模式:单线程和池化。 单线程模式针对将驱动程序嵌入到 PHP 等语言中进行了优化。 多线程程序应使用池化模式:此模式可最大限度地减少总连接数,在池化模式下,后台线程会监控 MongoDB 服务器拓扑,因此程序无需阻塞即可对其进行扫描。

在单一模式,您的程序会创建一个 mongoc_client_t 直接:

mongoc_client_t *client = mongoc_client_new (
"mongodb://hostA,hostB/?replicaSet=my_rs");

当您的程序首次将客户端用于MongoDB操作时,客户端会按需连接。 使用每个服务器的非阻塞套接字,它开始同时检查每个服务器,并使用异步 pollselect函数从套接字接收事件,直到所有服务器均已响应或超时。 换句话说,在单线程模式, C驱动程序会扇出以同时开始所有检查,然后在所有检查完成或超时后扇入。 扫描完成后,客户端将执行程序的操作并返回。

在单一模式,客户端大约每分钟重新扫描服务器拓扑结构一次。 如果自上次扫描以来时间间隔超过一分钟,则在客户端完成扫描时,客户客户端上的下一个操作将被区块。 此时间间隔可通过连接string中的 heartbeatFrequencyMS 进行配置。 (请参阅 mongoc_uri_t 。)

单个客户端为拓扑结构中的每个服务器打开一个连接:这些连接用于扫描拓扑结构和执行正常操作。

要激活池化模式,请创建一个 mongoc_client_pool_t:

mongoc_uri_t *uri = mongoc_uri_new (
"mongodb://hostA,hostB/?replicaSet=my_rs");
mongoc_client_pool_t *pool = mongoc_client_pool_new (uri);

当您的程序首次调用 mongoc_client_pool_pop 时 时,池会在背景启动监控线程。监控线程独立连接到连接string中的所有服务器。 当监控线程收到来自服务器的 hello 响应时,它们会更新服务器拓扑结构的共享视图。 发现新服务器时会创建更多监控线程和连接。 当服务器从服务器拓扑结构的共享视图中删除时,监控线程将终止。

每个执行MongoDB操作的线程都必须从池中检出一个客户端:

mongoc_client_t *client = mongoc_client_pool_pop (pool);
/* use the client for operations ... */
mongoc_client_pool_push (pool, client);

mongoc_client_t 对象不是线程安全的,只有 mongoc_client_pool_t 群岛。

当驾驶员处于池化模式时,一旦监控发现可用的服务器,程序的操作就会被解除阻塞。 示例,如果程序中的一个线程正在等待在主节点 (primary node in the replica set)节点上执行“插入”,则一旦发现主节点 (primary node in the replica set)节点,该线程就会解除阻塞,而不是等待所有从节点也被检查到。

该池为每个服务器打开一个连接用于监控,每个客户端打开到其用于应用程序操作的每台服务器的连接。 后台监控线程大约每10秒独立重新扫描一次服务器。 此时间间隔可通过连接string中的 heartbeatFrequencyMS 进行配置。 (请参阅 mongoc_uri_t 。)

连接string 还可以指定waitQueueTimeoutMS 来限制 mongoc_client_pool_pop 将等待池中的客户端。(请参阅 mongoc_uri_t 。)如果指定了waitQueueTimeoutMS ,则需要确认实际返回了客户端:

mongoc_uri_t *uri = mongoc_uri_new (
"mongodb://hostA,hostB/?replicaSet=my_rs&waitQueueTimeoutMS=1000");
mongoc_client_pool_t *pool = mongoc_client_pool_new (uri);
mongoc_client_t *client = mongoc_client_pool_pop (pool);
if (client) {
/* use the client for operations ... */
mongoc_client_pool_push (pool, client);
} else {
/* take appropriate action for a timeout */
}

请参阅 连接池选项 配置池大小和行为,请参阅 mongoc_client_pool_t 查看在池化模式使用驾驶员程序的多线程程序的扩展示例。

后退

高级连接

在此页面上