Docs Menu
Docs Home
/ /

Utilice un grupo de conexiones

En esta guía, aprenderá a usar el controlador de C++ para crear y configurar un pool de conexiones. Un pool de conexiones es una caché de objetos cliente que su aplicación puede usar para administrar múltiples operaciones simultáneas de MongoDB.

Después de crear una instancia de mongocxx::poolEl grupo crea objetos de cliente según sea necesario hasta alcanzar su tamaño máximo. Cada subproceso que ejecuta operaciones de MongoDB extrae un cliente del grupo, lo utiliza para realizar operaciones y lo devuelve al grupo. El grupo gestiona automáticamente el ciclo de vida de estos clientes.

Importante

A diferencia de la mayoría de los controladores MongoDB, el controlador C++ no implementa MongoDB Especificación de Monitoreo y Agrupación de Conexiones (CMAP). En este contexto, la agrupación de conexiones se refiere a la caché de objetos de cliente del controlador, en lugar de a las conexiones de base de datos.

Los grupos de conexiones ofrecen importantes ventajas de rendimiento en comparación con los clientes independientes. Un mongocxx::pool utiliza subprocesos de monitorización en segundo plano independientes para supervisar continuamente el clúster. Como resultado, los subprocesos de la aplicación pueden realizar operaciones sin esperar a que finalice la monitorización de la topología. Por el contrario, un mongocxx::client independiente se detiene periódicamente para comprobar el estado del clúster, bloqueando todas las operaciones durante la comprobación.

Puede usar un pool de conexiones incluso si su aplicación solo usa un subproceso. La monitorización en segundo plano del pool ofrece un mejor rendimiento que las comprobaciones periódicas de un cliente independiente.

La siguiente tabla resume las principales diferencias entre mongocxx::pool y mongocxx::client:

Característica
mongocxx::pool
mongocxx::client

Recomendado para aplicaciones multiproceso

Sí.

No.

Monitoreo de fondo

Sí. Los pools utilizan un hilo separado para cada servidor.

No. Los clientes realizan comprobaciones de bloqueo periódicas.

Intervalo de monitorización

Cada 10 segundos por servidor.

Cada 60 segundos.

Seguridad del hilo

Es seguro para subprocesos, pero los clientes adquiridos no lo son.

No es seguro para subprocesos.

Seguridad de la horquilla

Debes crear el pool después de la bifurcación.

Debes crear el cliente después de la bifurcación.

Tip

Roscado y bifurcado

Para obtener más información sobre cómo usar clientes y objetos de cliente en varios subprocesos y al bifurcar procesos, consulte Guía deseguridad de roscas y horquillas.

Para crear un pool de conexiones, instancia un objeto mongocxx::pool pasando la URI de conexión a su constructor. Cada subproceso que ejecuta operaciones de MongoDB debe adquirir un cliente del pool mediante la función miembro acquire(). Cuando el cliente sale del ámbito, regresa automáticamente al pool.

Este archivo de muestra realiza las siguientes acciones:

  • Crea un grupo de conexiones

  • Crea tres subprocesos, cada uno de los cuales adquiere su propio cliente del grupo.

  • Realiza una operación de inserción en cada hilo

1#include <iostream>
2#include <thread>
3#include <vector>
4
5#include <bsoncxx/builder/basic/document.hpp>
6#include <bsoncxx/builder/basic/kvp.hpp>
7#include <mongocxx/instance.hpp>
8#include <mongocxx/pool.hpp>
9#include <mongocxx/uri.hpp>
10
11using bsoncxx::builder::basic::kvp;
12using bsoncxx::builder::basic::make_document;
13
14int main() {
15 mongocxx::instance instance{};
16
17 mongocxx::uri uri{"mongodb://localhost:27017"};
18 mongocxx::pool pool{uri};
19
20 std::vector<std::thread> threads;
21
22 // Creates multiple threads that each acquire a client from the pool
23 for (int i = 0; i < 3; ++i) {
24 threads.emplace_back([&pool, i]() {
25 auto client = pool.acquire();
26 auto collection = (*client)["db"]["coll"];
27
28 // Inserts a sample document
29 collection.insert_one(make_document(kvp("thread_id", i)));
30
31 std::cout << "Thread " << i << " inserted a document" << std::endl;
32 });
33 }
34
35 // Waits for all threads to complete
36 for (auto& thread : threads) {
37 thread.join();
38 }
39
40 std::cout << "All threads completed" << std::endl;
41
42 return 0;
43}

Puede configurar el comportamiento del grupo de conexiones incluyendo opciones en la URI de conexión. La siguiente tabla describe las opciones que puede configurar:

Opción URI
Descripción

maxPoolSize

Specifies the maximum number of clients the pool can create. When this limit is reached, the acquire() member function blocks until another thread returns a client to the pool.
Defaults to 100.
Type: int

minPoolSize

Specifies the minimum number of clients the pool maintains. The pool creates this number of clients when initialized and maintains at least this number of clients continuously.
Defaults to 0.
Type: int

waitQueueTimeoutMS

Specifies the maximum time in milliseconds that the acquire() function waits for a client to become available when the pool has reached the maxPoolSize value. If this timeout expires, the acquire() function generates an error.
Defaults to no timeout.
Type: int

El siguiente ejemplo especifica la opción maxPoolSize para crear un grupo de conexiones con un tamaño máximo de 5 clientes:

mongocxx::uri uri{"mongodb://localhost:27017/?maxPoolSize=5"};
mongocxx::pool pool{uri};

Para obtener más información sobre los tipos y funciones analizados en esta guía, consulte la siguiente documentación de API:

Volver

Stable API

En esta página