O driver MongoDB C oferece dois modos de conexão: thread único e pool. Recomendamos usar o modo pool , especialmente para aplicativos com várias threads.
Importante
Ao contrário de outros drivers MongoDB , o driver C não implementa a especificação CMAP para pool de conexões. No contexto do driver C, o pool de conexões refere-se ao cache do driver de objetos de cliente , não a conexões de banco de dados .
Modo Agrupado
Para usar o modo agrupado, crie um 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);
Quando você chama pela primeira vez mongoc_client_pool_pop, o pool inicia threads de monitoramento em segundo plano. Os threads de monitoramento se conectam independentemente a todos os servidores no URI de conexão. À medida que os threads de monitoramento recebem respostas hello dos servidores, eles atualizam a visão compartilhada da topologia do servidor . O pool cria threads e conexões de monitoramento adicionais à medida que descobre novos servidores. O monitoramento de threads termina quando o pool remove servidores da exibição compartilhada da topologia do servidor .
Cada thread que executa operações MongoDB deve fazer check-out de um cliente do pool:
mongoc_client_t *client = mongoc_client_pool_pop(pool); /* use the client for operations ... */ mongoc_client_pool_push(pool, client);
Objetos individuais mongoc_client_t não são seguros para threads. Somente o objeto mongoc_client_pool_t fornece segurança de thread.
No modo pool, as operações do seu programa são desbloqueadas assim que o monitoramento descobre um servidor utilizável. Por exemplo, se um thread em seu programa aguardar para executar uma "inserção" no primário, ele será desbloqueado assim que o primário for descoberto, em vez de esperar que todos os secundários sejam verificados.
O pool abre uma conexão por servidor para monitoramento. Cada cliente abre sua própria conexão com cada servidor usado para operações de aplicação . Os threads de monitoramento em segundo plano verificam os servidores independentemente a cada 10 segundos. Você pode configurar este intervalo especificando a heartbeatFrequencyMS opção no URI de conexão. (Consulte mongoc_uri_t).
O pool de cliente cria um novo objeto mongoc_client_t quando não há objeto de cliente disponível no pool e o limite maxPoolSize ainda não foi atingido. O valor maxPoolSize padrão é 100.
Você também pode especificar waitQueueTimeoutMS no URI de conexão para limitar o tempo que mongoc_client_pool_pop espera um cliente do pool. (Consulte mongoc_uri_t). Se você waitQueueTimeoutMS especificar, confirme se o pool realmente retorna um cliente:
mongoc_client_t *client = mongoc_client_pool_pop(pool); if (client) { /* use the client for operations */ mongoc_client_pool_push(pool, client); } else { /* handle a wait queue timeout */ }
Dica
Para uma alternativa sem bloqueio mongoc_client_pool_pop para, use mongoc_client_pool_try_pop.
Consulte as opções do pool de conexões para configurar o tamanho e o comportamento do pool. Consulte mongoc_client_pool_t para obter um exemplo estendido de um programa multithread que usa o driver no modo pooled.
Modo de thread único
Para usar o modo de thread único, crie um mongoc_client_t diretamente:
mongoc_client_t *client = mongoc_client_new( "mongodb://hostA,hostB/?replicaSet=my_rs");
O cliente se conecta sob demanda quando você o usa pela primeira vez para uma operação do MongoDB . Usando um soquete sem bloqueio por servidor, o cliente inicia uma verificação em cada servidor simultaneamente e usa a função assíncrona poll ou select para receber eventos dos soquetes até que todos tenham respondido ou atinja o tempo limite. No modo de thread único , o Driver C é distribuído para iniciar todas as verificações simultaneamente e, em seguida, é ativado quando todas as verificações forem concluídas ou expiradas. Após a conclusão da verificação, o cliente executa sua operação e retorna.
No modo de thread único, o cliente verifica novamente a topologia do servidor cerca de uma vez por minuto. Se mais de um minuto se passar desde a verificação anterior, a próxima operação no cliente será bloqueada enquanto o cliente conclui a verificação. Você pode configurar este intervalo utilizando o heartbeatFrequencyMS parâmetro no URI de conexão. (Consulte mongoc_uri_t).
Um cliente de thread único abre uma conexão por servidor em sua topologia. Essas conexões lidam com a verificação da topologia e a execução de operações normais.
Dica
Você pode especificar a opção serverSelectionTryOne=false em seu URI de conexão para melhorar a resiliência da conexão dos objetos de cliente de thread único com o MongoDB.