C# MongoDB 驱动程序忽略超时选项

标签 c# mongodb timeout

我们正在为 Mongo DB 使用 C# 驱动程序 (1.9.1)。如果数据库不可访问,我们有一些需要运行的回退逻辑,但是默认超时太长。我们试图改变它,但我们设置的值却被忽略了。对于测试,我们使用的是无响应机器的 IP。

我们尝试在连接字符串中设置超时:

 <add key="Mongo" value="mongodb://xxx.xxx.xxx.xxx:27017/?socketTimeoutMS=2000&amp;connectTimeoutMS=2000&amp;waitqueuetimeoutms=2000"/>

或者通过代码:

var client = new MongoClient(new MongoClientSettings
{
    Server = new MongoServerAddress("xxx.xxx.xxx.xxx"),
    SocketTimeout = new TimeSpan(0, 0, 0, 2),
    WaitQueueTimeout = new TimeSpan(0, 0, 0, 2),
    ConnectTimeout = new TimeSpan(0, 0, 0, 2)
});

两次请求均在平均约 20 秒后超时。

我们设置超时选项的方式可能有什么问题。

最佳答案

有一张JIRA票证CSHARP-1018跟踪这个问题。基本上,当机器不可访问时,驱动程序会忽略超时选项。如果机器关闭或不可访问,超时选项将被忽略。

Connection logic has been fixed in 2.0. It currently will try for 30 seconds, but that is configurable to something smaller if you need faster connection times

请参阅 JIRA 票据以了解此问题的进展情况。

查看发布到 CSHARP-1231 的解决方法对于可以在当前 2.0.0 版本的驱动程序中设置 ServerSelectionTimeout 的方法,如果您更喜欢这种方法而不是对特定操作使用较短的超时。


如果您使用的是新的 2.0 异步 API,您可以使用取消 token 将您自己的超时应用于整体操作。

所以我会在之前的评论中推荐取消 token 方法。如果服务器选择超时时间短于完成选举所需的时间,则使用较短的服务器选择超时时间可能会导致副本集选举期间出现虚假异常。

你可以这样写:

var startTime = DateTime.UtcNow;
try
{
    using (var timeoutCancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(500)))
    {
        await collection.Find("{ _id : 1 }").ToListAsync(timeoutCancellationTokenSource.Token);
    }
}
catch (OperationCanceledException ex)
{
    var endTime = DateTime.UtcNow;
    var elapsed = endTime - startTime;
    Console.WriteLine("Operation was cancelled after {0} seconds.", elapsed.TotalSeconds);
}

在此示例中,即使 ServerSelectionTimeout 仍是 30 秒的默认值,此特定操作将在仅 500 毫秒后取消(大约,取消有时需要稍长的时间)。

关于C# MongoDB 驱动程序忽略超时选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24825107/

相关文章:

带套接字 tcp 的 C# ssl/tls

python - python 中的 mongodb 列约束,如 ruby​​ mongoid

python - 使用来自 EVE 的自签名证书连接到 MongoDB

java - java web服务Web服务超时

javascript - 在上一次调用中执行同一函数后,如何在 1 秒内多次调用函数? (javascript)

c# - C# 字典中的 LINQ 选择

c# - 生成错误 : You must add a reference to System. 运行时

mongodb - 如何将primitive.m 断言为map[string]string

python - 请求返回 "Endpoint request timed out"

c# - 无效操作异常 : Can only base on a Style with target type that is base type 'TextBlock'