Docs Menu
Docs Home
/ /

接続プール

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 スレッドは、約 秒ごとにサーバーを個別に再スキャンします。この間隔は、接続heartbeatFrequencyMS URI で オプションを指定することで構成できます。 ( mongoc_uri_t を参照してください)。

プール内で使用可能なクライアントオブジェクトがなく、maxPoolSize の制限にまだ達していない場合、クライアントプールは新しい mongoc_client_tオブジェクトを作成します。デフォルトのmaxPoolSize 値は 100 です。

waitQueueTimeoutMS接続 URI waitQueueTimeoutMS を指定して、 mongoc_client_Pool_pop がプールからのクライアントを待機する時間を制限することもできます。 ( mongoc_uri_t を参照してください)。 を指定した場合は、プールが実際にクライアントを返すことを確認します。

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 分以上が経過すると、クライアントがスキャンを完了している間にクライアントでの次の操作がブロックされます。この間隔は、接続heartbeatFrequencyMS URI で パラメータを使用して構成できます。 ( mongoc_uri_t を参照してください)。

シングルスレッドクライアントは、トポロジー内のサーバーごとに 1 つの接続を開きます。これらの接続は、トポロジーのスキャンと通常の操作の実行の両方を処理します。

Tip

接続 URI で serverSelectionTryOne=false オプションを指定すると、シングルスレッドクライアントオブジェクトのMongoDBへの接続の回復力を改善できます。

戻る

Stable API

項目一覧