我目前正在开发一个使用MongoDB的Golang代码库。困扰我的是,每次查询都会创建一个新的context.WithTimeout。让我举一个例子:
ctx, cancel := context.WithTimeout(ctx, defaultTimeout)
defer cancel()
collection := m.Client.Database(....
result := collection.FindOne(ctx, filter)我尝试不使用上下文的一种方法是:
options.FindOne().SetMaxTime(defaultTimeout)但是当我测试的时候,有一些非常小的超时时间(比如1纳秒),它不会导致超时吗?你对为什么不起作用有什么想法吗?
另外,是否有办法将这种超时设置为所有查询的全局选项?
交易呢?
发布于 2020-06-22 15:30:57
我猜,$maxTimeMS是您试图使用的限制服务器执行查询时间的方法。文档中提到了中断点,即取决于查询,服务器可能会接受超过规定的限制而不是中断。
上下文超时应用于客户端,并指定驱动程序等待服务器响应的时间。
这两次超时确实有不同的目的。如果您想中止长期运行的查询,则应该使用maxTimeMS (这也将释放服务器资源,否则即使在客户端超时之后,服务器仍将继续处理查询)。如果要防止网络故障,请使用客户端超时。
您可以跨多个操作重用上下文。实际上,这限制了所有操作在一起所需的总时间。
若要全局指定套接字超时,请使用socketTimeoutMS URI选项。
https://stackoverflow.com/questions/62515783
复制相似问题