MongoDB Server実行時間の制限
Overview
Node.jsドライバーを使用してサーバー操作を実行する場合、サーバーが操作 を完了するまでの期間も制限できます。そのためには、クライアント側操作タイムアウト(CST) を指定します。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。タイムアウトが経過すると、 Node.jsドライバーはタイムアウトの例外を発生させます。
注意
試験用機能
COT 機能は実験的なものであり、今後のドライバー リリースで変更される可能性があります。
timeoutMS オプション
MongoDBデプロイに接続するときにタイムアウトを指定するには、timeoutMS
接続オプションをミリ秒単位でタイムアウトの長さに設定します。これは、MongoClient
コンストラクターに引数を渡す方法と、接続文字列のパラメーターを使用する方法の 2 つがあります。
次のコード例では、 timeoutMS
オプションを使用して30秒のタイムアウトを指定しています。
const uri = "mongodb://<hostname:<port>"; const client = new MongoClient(uri, { timeoutMS: 30000 });
const uri = "mongodb://<hostname:<port>?timeoutMS=30000"; const client = new MongoClient(uri);
注意
timeoutMS
接続オプションは次のオプションよりも優先されます。
socketTimeoutMS
waitQueueTimeoutMS
wTimeoutMS
maxTimeMS
maxCommitTimeMS
CSO 機能が実験的なものでなくなり、前述のオプションは非推奨になります。
timeoutMS
オプションを指定すると、ドライバーはサーバー操作ごとに指定されたタイムアウトを自動的に適用します。次のコード例では、クライアントレベルで 10 秒のタイムアウトを指定し、insertOne()
メソッドを呼び出します。
const uri = "<connection string uri>"; const client = new MongoClient(uri, { timeoutMS: 10000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); const result = await coll.insertOne({ name: "Yngwie" }); console.log("Insert result:", result); } finally { await client.close(); } } run().catch(console.dir);
タイムアウト継承
timeoutMS
オプションを指定すると、ドライバーは他のNode.jsドライバー オプションと同じ継承動作に従ってタイムアウトを適用します。以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。
レベル | 継承の説明 |
---|---|
操作 | 優先順位が最も高く、他のレベルに設定されている |
トランザクション | セッション、コレクション、データベース、またはクライアントレベルで設定された |
セッション | オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのセッション内のすべてのトランザクションと操作に適用されます。 |
Database | オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのデータベース内のすべてのセッションと操作に適用されます。 |
コレクション | オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのコレクションに対するすべてのセッションと操作に適用されます。 |
クライアント |
|
オーバーライドと特定のオプションの詳細については、「 オーバーライド セクション 」を参照してください。
の上書き
Node.jsドライバーは、データベース操作の動作とパフォーマンスを制御するためのさまざまなレベルの構成をサポートしています。
操作レベルで timeoutMS
オプションを指定すると、特定の操作のクライアントレベル構成を上書きできます。これにより、個々のクエリのニーズに基づいてタイムアウトをカスタマイズできます。
次の例は、操作レベルの timeoutMS
構成がクライアントレベルの timeoutMS
構成を無効にする方法を示しています。
// Creates a new MongoClient with a client-level timeoutMS configuration const uri = "<connection string uri>"; const client = new MongoClient(uri, { // Client-level timeout: 15 seconds timeoutMS: 15000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); // Performs a query operation with an operation-level timeoutMS configuration const docs = await coll.find({}, // Operation-level timeout: 10 seconds { timeoutMS: 10000 }) .toArray(); console.log(docs); } finally { await client.close(); } } run().catch(console.dir);
トランザクション
トランザクションを実装するために新しい ClientSession
インスタンスを作成する場合は、defaultTimeoutMS
オプションを使用します。 defaultTimeoutMS
を設定すると、次の目的で使用する timeoutMS
値を指定できます。
defaultTimeoutMS
を指定しない場合、ドライバーは親の MongoClient
に設定された timeoutMS
値を使用します。
withTransaction()
コールバックによって提供されるトランザクション セッション内の操作に timeoutMS
オプションを設定して、defaultTimeoutMS
を上書きすることはできません。指定すると、エラーがスローされます。
クライアントの暗号化
クライアント側フィールドレベル暗号化(CSFLE)を使用する場合、ドライバーは timeoutMS
オプションを使用して暗号化と復号化操作に許可される時間を制限します。
ClientEncryption
インスタンス を構築するときに timeoutMS
オプションを指定すると、そのインスタンスで実行されるすべての操作の有効期間が制御されます。 timeoutMS
を指定しない場合、インスタンスはClientEncryption
コンストラクターで使用される MongoClient
から timeoutMS
設定を継承します。
クライアントと ClientEncryption
の両方で直接 timeoutMS
を設定すると、ClientEncryption
に提供された値が優先されます。
Cursors
カーソルは、CSO 機能を使用する場合に構成可能なタイムアウト設定を提供します。必要に応じて、カーソルの有効期間またはカーソルの反復モードを構成することで、カーソルの処理を調整できます。モードを構成するには、timeoutMode
オプションを cursorLifetime
(デフォルトの )または iteration
に設定します。
カーソル有効期間モード
timeoutMS
カーソル有効モードでは、カーソルの有効期間全体が制限されます。このモードでは、カーソルの初期化とカーソル メソッドに対する後続のすべての呼び出しは、timeoutMS
オプションで指定された制限内に完了する必要があります。すべてのドキュメントはこの制限内で返される必要があります。停止しない場合、カーソルの有効期限が切れ、タイムアウトのエラーが発生します。
toArray()
メソッドまたは close()
メソッドを呼び出してカーソルを閉じると、killCursors
コマンドのタイムアウトがリセットされ、サーバー側のリソースがクリーンアップされるようになります。
次の例は、 timeoutMS
オプションを設定して、カーソルが初期化され、すべてのドキュメントが 10 秒以内に取得されるようにする方法を示しています。
const docs = await collection.find({}, {timeoutMS: 10000}).toArray();
カーソル反復モード
カーソル反復モードでは、 timeoutMS
オプションを使用して、各呼び出しを next()
、hasNext()
、または tryNext()
メソッドに制限します。タイムアウトは、各呼び出しが完了した後に更新されます。これは、Cappedコレクションや変更ストリームで find()
メソッドによって返される追尾可能 (tailable) カーソルなど、すべての追尾可能 (tailable) カーソルのデフォルトモードです。
次のコード例では、 timeoutMode
が iteration
に設定されているカーソルを使用して、mflix
コレクション内のドキュメントを反復処理し、各映画ドキュメントの imdb_url
を取得してログに記録します。
for await (const movie of mflix.find({}, { timeoutMode: 'iteration' })) { const imdbResponse = await fetch(movie.imdb_url); console.log(await imdbResponse.text()); }
API ドキュメント
Node.jsドライバーでタイムアウトを使用する方法の詳細については、次のAPIドキュメントを参照してください。