下面来自MongoDB's Go quickstart blog post的代码片段在连接到数据库时创建context.WithTimeout,并将其重用于延迟的Disconnect函数,我认为这是错误的.

func main() {
    client, err := mongo.NewClient(options.Client().ApplyURI("<ATLAS_URI_HERE>"))
    if err != nil {
        log.Fatal(err)
    }
    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Disconnect(ctx)
}

我的 idea 是-

context.WithTimeout设置创建时的最后期限(以Unix时间表示). 因此,将其传递给Connect是有意义的,因为如果它超过了时间限制(即,派生的UNIX时间),我们希望取消建立连接的过程.

现在,将同样的ctx传递给延迟的Disconnect,这很可能在future 晚些时候被称为ctx,这将导致ctx的时间成为过go .这意味着,当函数开始执行时,它已经过期.这不是预期的,打破了逻辑-引用Disconnect的文件-

如果上下文通过取消而期满, 截止时间或在正在使用的连接返回之前的超时,即正在使用的 连接将被关闭,从而导致任何动态读取失败 或写入操作.

请告诉我我是否错了和/或遗漏了什么,以及我是如何错的.

推荐答案

你的理解是正确的.

在该示例中,这是足够的,因为该示例只连接到数据库,执行一些示例操作(例如,列出数据库),然后main()结束,因此在相同的上下文中运行延迟断开不会造成任何问题(该示例将/应该在10秒内运行).

当然,在"真实世界"的应用程序中,情况并非如此.因此,您可能不会使用相同的上下文来连接和断开连接(除非该上下文没有超时).

Mongodb相关问答推荐

映射数组值并查找每个匹配的集合

在单个mongo文档中组合数组与聚合

MongoDB:如何获取多个$indexOfArray值?

Mongo $sort然后$group,顺序能保证吗?

使用Go的Mongo驱动程序,从MongoDB文档中获取元素并更新其值需要帮助

如何为具有相同名称的嵌套字段创建文本索引

如何判断 MongoDB 的两个数组中是否存在值?

mongoDB文档数组字段中的唯一项如何

使用golang的MongoDB错误无法访问服务器

嵌套数组 $unwind 和 $group 在 mongoDB 中重新组合在一起

为什么使用整数作为 pymongo 的键不起作用?

哪种 NoSQL DB 最适合 OLTP 金融系统?

为什么 local.oplog.rs 上每隔几分钟的活动就会锁定 mongo 客户端

为什么 PyMongo 会抛出 AutoReconnect?

将 mongodb 聚合框架结果导出到新集合

MongoDB GridFS VS 直接磁盘 IO

如何使用node.js http服务器从mongodb返回大量行?

MongoDB 连接字符串到副本集

Meteor 发布/订阅独特客户端集合的策略

有没有办法执行更新操作的dry run?