cursor.maxTimeMS()
定義
cursor.maxTimeMS(<time limit>)
重要
mongosh メソッド
このページでは、
mongosh
メソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
カーソルに対する情報処理操作の累積時間制限をミリ秒単位で指定します。
maxTimeMS()
メソッドのプロトタイプ形式は次のとおりです。db.collection.find( { <query> }, { <projection> } ).maxTimeMS( <milliseconds> ) maxTimeMS()
メソッドには次のパラメーターがあります。Parameterタイプ説明milliseconds
integerカーソルに対する処理操作の累積時間制限をミリ秒単位で指定します。
重要
maxTimeMS()
は、NoCursorTimeout
クエリ フラグとは関係ありません。maxTimeMS()
はプロセシング時間に関連し、 NoCursorTimeout
はアイドル時間に関連します。カーソルのアイドル時間は、そのプロセシング時間には寄与しません。
maxAwaitTimeMS()
メソッドは追尾可能 (tailable) カーソルが次の応答を待機する時間の制限を設定します。 合計処理時間に制限はありません。
動作
MongoDB は、関連付けられたカーソルが割り当てられた時間制限を超えた場合に、操作を終了の対象とします。MongoDB は、db.killOp()
と同じメカニズムを使用して、割り当てられた時間制限を超えた操作を終了します。MongoDB は、指定された割り込みポイントのいずれかでのみ操作を終了します。
MongoDB は、クライアントとサーバー間のレイテンシをカーソルの時間制限にカウントしません。ただし、シャーディングされたクラスターの場合、MongoDB は mongos
インスタンスと mongod
インスタンス間のレイテンシをこの時間制限に含めます。
複数の結果のバッチを生成するクエリは、カーソルが割り当てられた制限時間を超えるまでバッチを返し続けます。
セッション アイドル タイムアウトの上書き maxTimeMS
MongoDB ドライバーとmongosh
では、確認されていない書込み操作を除くすべての操作がサーバー セッションに関連付けられます。セッションに明示的に関連付けられていない操作(つまり Mongo.startSession()
を使用するもの)の場合、MongoDB ドライバーとmongosh
によって暗黙的なセッションが作成され、それが操作に関連付けられます。
セッションが30分以上アイドル状態になると、MongoDB サーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。 MongoDB サーバーがセッションを閉じると、セッションに関連付けられている進行中の操作と開いているカーソルもすべて強制終了されます。 これには、 noCursorTimeout()
または30分より大きいmaxTimeMS()
で構成されたカーソルが含まれます。
たとえば、find()
が 31 分のタイムアウトに設定された maxTimeMS()
nの操作を検討しましょう。サーバーは、find()
の cursor.batchSize()
で定義されたドキュメントのバッチとともにカーソルを返します。セッションは、アプリケーションがサーバーに新しいドキュメントのバッチをリクエストするたびに更新されます。ただし、アプリケーションが現在のドキュメントバッチを処理するのに 30 分より長くかかる場合、セッションは期限切れとしてマークされ、終了します。サーバーがセッションを閉じると、カーソルは maxTimeMS()
が 30 分より長く設定されているにもかかわらず、カーソルも強制終了されます。アプリケーションが次のドキュメントのバッチをリクエストすると、サーバーはエラーを返します。
カーソルを返す操作の場合、カーソルが 30 分以上アイドル状態になる可能性がある場合は、 Mongo.startSession()
を使用して明示的なセッション内で操作を発行し、 refreshSessions
コマンドを使用して定期的にセッションを更新します。以下がその例です。
var session = db.getMongo().startSession() var sessionId = session sessionId // show the sessionId var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout() var refreshTimestamp = new Date() // take note of time at operation start while (cursor.hasNext()) { // Check if more than 5 minutes have passed since the last refresh if ( (new Date()-refreshTimestamp)/1000 > 300 ) { print("refreshing session") db.adminCommand({"refreshSessions" : [sessionId]}) refreshTimestamp = new Date() } // process cursor normally }
この操作例では、 db.collection.find()
メソッドは明示的なセッションに関連付けられています。カーソルは、cursor.maxTimeMS()
で設定されており、少なくとも 31 分間開いたままになります。while
ループには、 refreshSessions
を使用して 5 分ごとにセッションを更新するブロックが含まれています。セッションが 30 分のアイドル タイムアウトを超えることはないため、カーソルは設定された maxTimeMS()
まで開いたままにできます。
MongoDB ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。
すべての操作のデフォルトタイムアウト
MongoDB 8.0 以降では、defaultMaxTimeMS
クラスターパラメータを使用して、個々の読み取り操作が完了するデフォルトの時間制限を指定できます。クエリで maxTimeMS()
オプションが指定されている場合、その値は defaultMaxTimeMS
の値を上書きします。
例
例
次のクエリでは、50 ミリ秒の時間制限を指定しています。
db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)