On this page
cursor.maxTimeMS()
在本页面
Definition
2.6 版的新功能。
cursor.
maxTimeMS
(* *)- 指定用于游标的处理操作的累积时间限制(以毫秒为单位)。
maxTimeMS()方法具有以下参数:
Parameter | Type | Description |
---|---|---|
milliseconds |
integer | 指定在光标上进行处理操作的累积时间限制(以毫秒为单位)。 |
Important
maxTimeMS()与NoCursorTimeout
查询标志无关。 maxTimeMS()与处理时间有关,而NoCursorTimeout
与空闲时间有关。游标的空闲时间不影响其处理时间。
Behaviors
如果关联的游标超过了其分配的时间限制,则 MongoDB 将终止操作作为目标。 MongoDB 使用与db.killOp()相同的机制终止超出其分配的时间限制的操作。 MongoDB 仅在其指定的interrupt points处终止操作。
MongoDB 不会将网络延迟计入游标的时间限制。
生成多批次结果的查询将 continue 返回批次,直到游标超过其分配的时间限制为止。
会话空闲超时会覆盖 maxTimeMS
从 MongoDB 3.6 开始,MongoDB 驱动程序和mongo shell 将所有操作与server session关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()),MongoDB 驱动程序和mongo
Shell 创建隐式会话并将其与该操作相关联。
如果会话空闲时间超过 30 分钟,则 MongoDB 服务器会将会话标记为已过期,并可以随时关闭它。当 MongoDB 服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置为noCursorTimeout或maxTimeMS大于 30 分钟的光标。
例如,考虑将find()操作与maxTimeMS配置为 31 分钟的超时。服务器返回游标以及由find()的cursor.batchSize()定义的一批文档。每当应用程序从服务器请求新一批文档时,会话都会刷新。但是,如果应用程序花费超过 30 分钟的时间来处理当前一批文档,则该会话将被标记为已过期并关闭。当服务器关闭会话时,它也会杀死光标,尽管该光标配置了maxTimeMS大于 30 分钟。当应用程序请求下一批文档时,服务器将返回错误。
对于返回游标的操作,如果游标可能闲置了 30 分钟以上,请使用Session.startSession()
在显式会话中发出操作,并使用refreshSessions命令定期刷新该会话。例如:
var session = db.getMongo().startSession()
var sessionId = session.getSessionId().id
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 驱动程序,请参考driver documentation以获取有关创建会话的说明和语法。
See also
Examples
Example
以下查询指定 50 毫秒的时间限制:
db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)