mongo-go-driver 上下文包装函数

所有 mongo-go-driver 的数据库查询方法都接受一个上下文:


func (coll *Collection) Find(ctx context.Context, ...)

通常将带有超时的 http 请求上下文的子项传递给这些查询方法:


ctx, cancel = context.WithTimeout(request.Context()), 5*time.Second)

defer cancel()

cur, err := collection.Find(ctx, ...)

这会在 Web 应用程序的代码库中创建大量样板。我正在考虑创建在内部创建上下文的包装函数:


func (db *Database) FindWithContext(filter interface{}) error {

  ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)

  defer cancel()  

  return db.Collection.Find(ctx, filter)

}

这是一个不好的做法吗?上下文是否应该是 http 请求的子级,以便超时和取消在处理程序内进行?创建包装函数会破坏上下文的全部目的吗?


HUH函数
浏览 79回答 1
1回答

翻翻过去那场雪

如果这对你有用,我认为按照你的建议去做没有问题。Go 驱动程序通常使用起来很冗长。请注意,大多数驱动程序并未按照 Go 驱动程序建议的使用方式为每个操作指定超时。您可以考虑通过 URI 选项设置套接字超时,这可以为整个程序完成一次,但与每次操作超时并不完全相同。另请注意,通常正在努力改进驱动程序中的每次操作超时处理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go