Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/ /

限制MongoDB Server执行时间

在本指南中,您可以学习;了解Go驾驶员中的单个超时设置,也称为客户端操作超时 (CSOT)

当您使用Go驾驶员执行服务器操作时,您还可以限制服务器可以完成该操作的时间。超时适用于完成操作所需的所有步骤,包括服务器选择、连接签出和服务器端执行。超时后, Go驾驶员会引发超时异常。

注意

实验功能

CSOT功能是实验性的,可能在未来的驱动程序发布中发生变化。

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

  • 在为 Client实例指定选项时调用 SetTimeout() 方法

  • 在连接string中设置 timeoutMS 参数

以下代码示例将客户端级超时设立为 200 毫秒。选择 ClientConnection String标签页以查看相应的代码。

opts := options.Client().SetTimeout(200 * time.Millisecond)
client, err := mongo.Connect(opts)
uri := "<connection string>/?timeoutMS=200"
client, err := mongo.Connect(options.Client().ApplyURI(uri))

注意

超时规范下的重试

如果您在 Client 上或在操作级上下文中设立了超时,并且服务器返回了可重试错误,则驾驶员会在超时之前尽可能多次重试该操作。

一旦超时,驾驶员就会返回超时错误。有关 可重试读取可重试写入的更多信息,请参阅服务器手册。

下表描述了与 timeoutMS 的可接受值相对应的超时行为:

行为

正整数

设置操作完成时使用的超时时间。

0

指定操作永不超时。

null 或未设置

Defers the timeout behavior to the following settings:
These settings are deprecated and are ignored if you set timeoutMS.

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

默认下,如果您没有在操作的上下文中为特定操作设立不同的超时时间,则应用程序中的所有操作都会继承 ClientTimeout 选项。

如果为传递到操作的上下文设立了超时,驾驶员将使用该值进行操作。 如果未指定上下文超时,则操作上下文会从 Client实例中派生超时。

下表描述了如何在每个级别继承超时值:

等级
继承说明

操作

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

事务

优先于您在客户端端级别设立的超时值。

客户

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

有关覆盖和特定选项的更多信息,请参阅以下覆盖部分。

Go驾驶员支持各种级别的配置来控制数据库操作的行为和性能。

您可以在更具体的级别指定 timeoutMS 选项来覆盖客户端级别的配置。上一节中的表描述了可以指定超时设置的级别。这允许您根据各个操作的需求自定义超时。

以下示例展示了如何在 Context 中设立操作级超时,该操作级超时优先级于客户端级超时:

opts = options.Client().SetTimeout(200 * time.Millisecond)
client, err = mongo.Connect(opts)
if err != nil {
log.Fatal(err)
}
coll := client.Database("db").Collection("people")
ctx, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond)
defer cancel()
_, err = coll.InsertOne(ctx, bson.D{{"name", "Agnes Georgiou"}})

使用 WithTransaction() 方法执行ACID 事务时,可以通过在上下文中设置超时来对ACID 事务操作应用。

以下代码演示了如何在调用 WithTransaction() 方法执行ACID 事务时设立上下文超时:

txnContext, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond)
defer cancel()
result, err := session.WithTransaction(txnContext, func(ctx context.Context) (string, error) {
// Perform transaction operations
})

如果不指定上下文超时,驾驶员将继承在父 Client 上设立的超时值。

您还可以将上下文超时传递给以下会话方法:

  • AbortTransaction()

  • CommitTransaction()

  • EndSession()

要学习;了解有关事务的更多信息,请参阅 事务指南。

使用 CSOT功能时,游标提供可配置的超时设置。您可以通过将具有超时规范的上下文传递给游标方法来调整游标超时。

对于创建游标的操作,超时设置可以限制游标的生命周期,也可以单独应用于原始操作和所有后续调用。

示例,如果将上下文超时传递给 Cursor.Next() 方法,则该超时将应用于获取结果文档的每个动作。如果将上下文超时传递给 Cursor.All() 方法,则该超时将适用于游标的整个生命周期。

要学习;了解有关游标的更多信息,请参阅《从游标访问数据》指南。

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

后退

Stable API

在此页面上