mongodb - 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 请求的子级,以便超时和取消在处理程序内进行?创建包装函数会破坏上下文的全部目的吗?
解决方案
如果这对你有用,我认为按照你的建议去做没有问题。Go 驱动程序通常使用起来很冗长。
请注意,大多数驱动程序并未按照 Go 驱动程序建议的使用方式为每个操作指定超时。
您可以考虑通过 URI 选项设置套接字超时,这可以为整个程序完成一次,但与每次操作超时并不完全相同。
另请注意,通常正在努力改进驱动程序中的每次操作超时处理。
推荐阅读
- google-bigquery - 将 BigQuery GA 数据加载到 Redshift
- sql - 按财政/财政年度的 SQL 组
- javascript - rallies.php:113 Uncaught TypeError:无法设置未定义的属性“显示” - 阅读正文
- amazon-web-services - React Native 登录联合 AWS Facebook 和 Google
- c++ - Bazel:将编译标志添加到默认 C++ 工具链
- c++ - 复制构造函数中的 C++ 命名空间冲突
- r - 是否有 R 函数可以将代码用于文件列表
- angular - Angular 组件的这种安排是错误的吗?
- ssl - gke cert manager certificate in progress
- android - Android studio Firebase 查询 - 从回调函数中检索值并将其分配给变量