Docs 菜单
Docs 主页
/ /

限制MongoDB Server执行时间

在本指南中,您可以学习;了解如何使用 timeout_ms 选项为服务器操作设立超时。

使用Ruby驾驶员执行服务器操作时,可以限制服务器完成操作所允许的持续时间。为此,请指定客户端操作超时 (CSOT)。超时适用于完成操作所需的所有步骤,包括服务器选择、连接签出和服务器端执行。如果在操作完成之前超时, Ruby驾驶员会引发超时异常。

要在连接到MongoDB 部署时指定超时,请将 timeout_ms 连接选项设立为超时长度(以毫秒为单位)。您可以通过以下方式指定超时值:

  • timeout_ms客户端选项传递给 Mongo::Client 构造函数。

  • timeoutMS连接字符串选项作为参数传递给您的连接字符串。

从以下标签页中进行选择,查看如何使用 timeout_ms客户端选项或 timeoutMS连接字符串选项来指定 30 秒超时的示例:

uri = "<connection string>"
options = { timeout_ms: 30000 }
client = Mongo::Client.new(uri, options)
uri = "mongodb://<hostname>:<port>?timeoutMS=30000"
client = Mongo::Client.new(uri)

如果指定 timeout_ms 选项,驾驶员会自动为每个服务器操作应用指定的超时时间。

注意

timeout_ms 连接选项统一了大多数超时相关选项。以下超时选项已弃用:

  • socket_timeout

  • wait_queue_timeout

  • wtimeout

  • max_time_ms

  • max_commit_time_ms

timeout_ms 连接选项优先于这些已弃用的超时选项。

当您指定 timeout_ms 选项时,驾驶员将根据与其他Ruby驾驶员选项相同的继承行为应用超时。下表描述了如何在每个级别继承超时值:

等级
继承说明

操作

具有最高优先级并覆盖在任何其他级别设立的timeout_ms 选项。

事务

优先于在会话、集合、数据库或客户端级别设立的timeout_ms

会话

适用于该会话中的所有事务和操作,除非该选项被在这些级别设立的选项覆盖。

Database

适用于该数据库中的所有会话和操作,除非该选项被在这些级别设立的选项覆盖。

Collection

适用于该集合上的所有会话和操作,除非该选项被在这些级别设立的选项覆盖。

客户

适用于该客户端内未指定 timeout_ms 的所有数据库、集合、会话、事务和操作。

要学习;了解有关覆盖超时选项和设置其他选项的更多信息,请参阅以下 覆盖 部分。

您可以在操作级别指定 timeout_ms 选项,以覆盖特定操作的客户端级别配置。 这允许您根据各个查询的需求自定义超时。

以下示例演示了操作级 timeout_ms 配置如何覆盖客户端级 timeout_ms 配置:

require 'mongo'
# Replace the placeholder with your connection string
uri = "<connection string>"
# Sets a client-level timeout configuration
options = { timeout_ms: 30000 }
Mongo::Client.new(uri, options) do |client|
db = client.use('test-db')
collection = db[:test-collection]
# Performs a query with an operation-level timeout configuration,
# overriding the client-level configuration
docs = collection.find({}, timeout_ms: 10000).to_a
docs.each { |doc| puts doc }
end

您可以使用 default_timeout_ms客户端选项设立事务超时。

当您创建新的 Mongo::Session实例来实现ACID 事务时,可以设立default_timeout_ms客户端选项,为以下方法指定 timeout_ms 值:

如果不指定 default_timeout_ms,驾驶员将使用在父项 Mongo::Client 上设立的timeout_ms 值。

对于 start_session 调用,您无法覆盖 Mongo::Clienttimeout_ms 值。

您只能使用 timeout_ms 选项为 start_transaction 方法设立超时值。

您无法通过在 with_transaction回调提供的ACID 事务会话中的操作上设置 timeout_ms 选项来覆盖 default_timeout_ms,否则驾驶员会引发错误。

使用客户端字段级加密(CSFLE) 时,驾驶员使用 timeout_ms 选项来限制加密和解密操作所允许的时间。

如果在构造 ClientEncryption实例时指定 timeout_ms 选项,它将控制对该实例执行的所有操作的生命周期。 如果您不提供 timeout_ms,则实例将从 ClientEncryption 构造函数中使用的 Mongo::Client 继承 timeout_ms 设置。

如果您在客户端上和直接在 ClientEncryption 中同时设立timeout_ms,则提供给 ClientEncryption 的值优先。

使用 CSOT功能时,游标提供可配置的超时设置。 如果需要,可以通过配置游标生存期或游标迭代模式来调整游标处理。 要配置模式,设立为timeoutMode cursorLifetime(即默认)或iteration

游标生命周期模式使用 timeout_ms 来限制游标的整个生命周期。 在此模式下,游标的初始化以及对游标方法的所有后续调用必须在 timeout_ms 选项指定的限制内完成。 所有文档必须在此限制内退回。 否则,游标的生命周期将到期并出现超时错误。

当您通过调用 to_aclose 方法关闭游标时,超时将重置,以确保清理服务器端资源。

以下示例展示了如何设立timeout_ms 选项,以确保游标初始化并在 10 秒内检索所有文档:

docs = collection.find({}, timeout_ms:10000).to_a

游标迭代模式使用 timeout_ms 选项来限制对 try_next 方法的每次调用。每次调用完成后,超时时间都会刷新。这是所有可追加游标的默认模式,例如 find 方法在固定大小集合或变更流上返回的可追加游标。

以下代码示例使用可迭代游标遍历示例集合中的文档,然后获取并记录每个电影文档的 title 信息:

cursor = collection.find()
cursor.each do |movie|
puts movie['title']
end

要学习;了解有关在Ruby驾驶员中使用超时的更多信息,请参阅以下API文档:

后退

Stable API

在此页面上