AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

接続プールによる接続の管理

このガイドでは、 Node.jsドライバーが接続プールを使用してMongoDBデプロイへの接続を管理する方法と、アプリケーションで接続プール設定を構成する方法について学習できます。

接続プールは、 Node.jsドライバーによって維持されるオープンデータベース接続のキャッシュです。アプリケーションがMongoDBへの接続を要求すると、 Node.jsドライバーはプールからシームレスに接続を取得し、操作を実行し、再利用するためにプールに接続を返します。

接続プールは、アプリケーションのレイテンシとNode.jsドライバーによって新しい接続が作成される回数を削減するのに役立ちます。

すべての MongoClientインスタンスには、 MongoDBトポロジー内の各サーバーに対する組み込み接続プールがあります。minPoolSize オプションを構成しない場合、接続プールはオンデマンドでソケットを開き、アプリケーション内のMongoDBへの同時要求をサポートします。

MongoClientインスタンスでは、次の接続プール設定を指定できます。

設定
説明

maxPoolSize

プールが維持する同時接続の最大数。サーバーへの使用中の接続数が指定された値に達した場合、そのサーバーへの次のリクエストは接続が利用可能になるまで待機します。

デフォルト: 100

maxConnecting

各プールが同時に確立できる接続の最大数。

minPoolSize

プールが維持する同時接続の最小数。

デフォルト: 0

maxIdleTimeMS

プール内で接続がアイドル状態を維持できる最大時間(ミリ秒)。この値は、アプリケーションの予想されるアイドル期間よりも高く、ファイアウォールまたはプロキシの接続タイムアウトよりは低く設定して、予期しない切断を防ぐために、

デフォルト: 0(制限なし)

waitQueueTimeoutMS

ソケットが使用可能になるまでリクエストが待機できる最大時間(ミリ秒)。

デフォルト: 0(制限なし)

アプリケーションのリクエストをサポートするために必要なソケットに加えて、各 MongoClientインスタンスは、サーバーの状態を監視するためにMongoDBトポロジー内のサーバーごとに最大 2 つの接続を開きます。

For example, a client connected to a three-node replica set opens six monitoring sockets. If the application uses the default setting for maxPoolSize and only queries the primary (default) node, then there can be at most 106 open sockets and 100 connections in the connection pool. If the application uses a read preference to query the secondary nodes, those connection pools grow and there can be 306 total connections including the open monitoring sockets.

1 つのプロセス内で多数の同時 MongoDB リクエストをサポートするには、 maxPoolSizeを増やすことができます。

次のコードでは、optionsオブジェクトで maxPoolSize オプションを指定して、最大接続プールサイズが 200 である MongoClientインスタンスが作成されます。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxPoolSize: 200
});

接続プールは接続確立をレート制限します。maxConnecting オプションによって、プールが並行して作成できる接続数が決定されます。例、maxConnecting の値が 2 の場合、接続を同時にチェックアウトしようとする 3 番目のリクエストは、次のいずれかの場合にのみ成功します。

  • 接続プールは接続の作成を完了し、プール内の接続数はmaxPoolSize未満です。

  • 既存の接続がプールにチェックバックされます。

次のコードでは、optionsオブジェクトで maxConnecting オプションを指定して、プールごとに同時に確立される最大数の 2 接続を持つ MongoClientインスタンスを作成します。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxConnecting: 2
});

minPoolSize オプションを使用して、各サーバーへの最小接続数を設定できます。ドライバーが、接続プール内に minPoolSize オプションで設定された接続数以上が常に存在するようにします。ソケットが閉じられ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回る場合、最小値に達するまでさらにソケットが開かれます。

次のコードでは、optionsオブジェクトで minPoolSize オプションを指定して、最小接続プール サイズが 10 である MongoClientインスタンスが作成されます。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
minPoolSize: 10
});

注意

maxIdleTimeMSminPoolSize0 に設定して構成された MongoClient は、アクティビティが継続的に低いワークロードに最適です。この構成により、非アクティブな期間中に接続プールは未使用の接続を閉じることができます。

6.18.0 より前のバージョンでは、非アクティブな期間中に minPoolSize0 に設定されている場合、 Node.jsドライバーはアイドル接続を閉じませんでした。バージョン 6.18.0 以降では、minPoolSize 設定に関係なく、接続プールはアイドル接続を正しく閉じます。

maxIdleTimeMSオプションを設定することで、プール内で接続がアイドル状態を維持できる最大ミリ秒数を設定できます。 maxIdleTimeMSの接続がアイドル状態になると、接続プールはそれを削除し、置き換えます。 このオプションのデフォルトは0 (制限なし)です。

次のコードでは、optionsオブジェクトで maxIdleTimeMS 設定を指定して、最大アイドル時間が 10000 ミリ秒(10 秒)の MongoClientインスタンスを作成します。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxIdleTimeMS: 10000
});

MongoClient は、複数の同時リクエストをサポートします。 プロセスごとにクライアントを作成し、プロセス内のすべての操作で再利用します。 この方法は、リクエストごとにクライアントを作成するよりも効率的です。

ドライバーはソケットが利用可能になるまで待機できるリクエストの数を制限しません。負荷が急増したときにプールのサイズを境界のあるキューに制限するのはアプリケーションの責任です。 リクエストは、 waitQueueTimeoutMSオプションで指定された時間だけ待機します。デフォルトでは0 (制限なし)です。

ソケットを対象にwaitQueueTimeoutMSで定義された時間以上待機するリクエストでは、接続エラーが発生します。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。

次のコードでは、待機キューの最大タイムアウトが 10000 ミリ秒(10 秒)である MongoClientインスタンスを、optionsオブジェクトで宣言して作成します。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
waitQueueTimeoutMS: 10000
});

いずれかのリクエストで MongoClient.close() が呼び出されると、 Node.jsドライバーは次のアクションを実行します。

  • 接続プール内のすべてのアイドル ソケットを閉じます

  • 使用中のすべてのソケットは、プールに返されるときに閉じます

  • 関連する操作が完了した場合にのみ使用中のすべてのソケットを閉じます

MongoClient.close() を呼び出すと、非アクティブなソケットのみが閉じられ、実行中の操作は直接終了されません。

注意

MongoClient.close() メソッドは既存のセッションとトランザクションを閉じますが、実行中の操作や開いているカーソルの動作に間接的に影響を与える可能性があります。

接続プールが大きい場合でも、再接続リクエストは必ずしも削減されるわけではありません。次の例シナリオについて考えてみましょう。

  • アプリケーションの接続プールサイズが 5 ソケットで、socketTimeoutMS オプションが 5000 ミリ秒に設定されている。

  • 操作は平均して 3000 ミリ秒ごとに発生し、再接続リクエストは頻繁に発生します。

  • 各ソケットは 5000 ミリ秒後にタイムアウトするため、閉じないようにするには、すべてのソケットが 5000 ミリ秒中に何らかの操作を行う必要があります。

このシナリオでは、各ソケットは 5000 ミリ秒後にタイムアウトするため、クローズドを回避するにはこのタイムアウト期間内にアクティビティが必要です。ただし、3000 ミリ秒ごとに 1 回のメッセージではすべてのソケットをアクティブに保つには十分ではなく、複数のソケットでタイムアウトが発生します。

過剰なソケット タイムアウトを回避するには、maxPoolSize オプションを指定してドライバーが接続プール内で維持できる接続の数を減らします。maxPoolSize オプションを設定する方法については、maxPoolSize セクションを参照してください。

Node.jsドライバーを使用して MongoClientオブジェクトを作成し、オプションを指定する方法の詳細については、次のAPIドキュメントを参照してください。