MongoDB Cドライバーには、シングルスレッドとプールの 2 つの接続モードがあります。特にマルチスレッド アプリケーションの場合は、 プールモードを使用することをお勧めします。
重要
他のMongoDBドライバーとは異なり、 Cドライバーは接続プーリングの CMAP 仕様を実装していません。Cドライバーのコンテキストでは、接続プーリングはデータベース接続ではなく、クライアントオブジェクトのドライバーのキャッシュを指します。
プール モード
プールモードを使用するには、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 を呼び出すと、プールはバックグラウンドでモニタリングスレッドを起動します。モニタリング スレッドは、接続 URI 内のすべてのサーバーに個別に接続します。モニタリング スレッドがサーバーから 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オブジェクトのみがスレッドセーフ性を提供します。
プールモードでは、モニタリングが使用可能なサーバーを検出するとすぐに、プログラムの操作のブロックが解除されます。例、プログラム内のあるスレッドがプライマリで「挿入」を実行するのを待機している場合、すべてのセカンダリがチェックされるのを待つのではなく、プライマリが検出されるとすぐにブロックを解除します。
プールは、モニタリングのためにサーバーごとに 1 つの接続を開きます。各クライアントは、アプリケーション操作に使用する各サーバーに独自の接続を開きます。バックグラウンド モニタリング スレッドは、約 10 秒ごとにサーバーを個別に再スキャンします。この間隔は、接続 URI で heartbeatFrequencyMS オプションを指定することで構成できます。(mongoc_uri_t を参照してください)。
プール内で使用可能なクライアントオブジェクトがなく、maxPoolSize の制限にまだ達していない場合、クライアントプールは新しい mongoc_client_tオブジェクトを作成します。デフォルトのmaxPoolSize 値は 100 です。
接続 URI で waitQueueTimeoutMS を指定して、mongoc_client_Pool_pop がプールからのクライアントを待機する時間を制限することもできます。(mongoc_uri_t を参照してください)。waitQueueTimeoutMS を指定した場合は、プールが実際にクライアントを返すことを確認します。
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 */ }
Tip
mongoc_client_pool_pop の非ブロッキング代替としては、 mongoc_client_pool_try_pop を使用してください。
プールのサイズと動作を構成するには、接続プールオプションを参照してください。ドライバーを プールモードで使用するマルチスレッド プログラムの拡張例については、 mongoc_client_Pool_t を参照してください。
シングルスレッド モード
シングルスレッドモードを使用するには、mongoc_client_t を直接作成します。
mongoc_client_t *client = mongoc_client_new( "mongodb://hostA,hostB/?replicaSet=my_rs");
クライアントは、MongoDB操作に初めて使用するときにオンデマンドで接続します。サーバーごとに非ブロッキング ソケットを使用すると、クライアントは各サーバーのチェックを同時に開始し、非同期の poll または select 関数を使用して、すべてのサーバーが応答またはタイムアウトするまでソケットからイベントを受信します。シングルスレッドモードでは、 Cドライバーはフェイルアウトしてすべてのチェックを同時に開始し、すべてのチェックが完了またはタイムアウトするとプロファイリングします。スキャンが完了すると、クライアントは操作を実行し、戻ります。
シングルスレッドモードでは、クライアントはサーバートポロジーを 1 分ごとに約 1 回再スキャンします。前のスキャンから1分以上が経過すると、クライアントがスキャンを完了している間にクライアントでの次の操作がブロックされます。この間隔は、接続 URI で heartbeatFrequencyMS パラメータを使用して構成できます。(mongoc_uri_t を参照してください)。
シングルスレッドクライアントは、トポロジー内のサーバーごとに 1 つの接続を開きます。これらの接続は、トポロジーのスキャンと通常の操作の実行の両方を取り扱います。
Tip
接続 URI で serverSelectionTryOne=false オプションを指定すると、シングルスレッドクライアントオブジェクトの MongoDB への接続の回復力を改善できます。