来自 mongo 具有异步 API 的 c# 驱动程序的超时异常
TimeoutExceptions from mongo c# driver with Async API
我们使用来自 MongoDB (2.0.0-beta2) 的最新测试版驱动程序,具有所有异步功能。但与旧实现 (1.10.0-rc0) 相比,我们遇到了一些奇怪的 TimeoutExceptions。我们尝试了不同的服务器版本(其中包括 3.0.0-rc10),但这似乎没有影响。
System.TimeoutException occurred
HResult=-2146233083
Message=Operation timed out after 00:00:30.
Source=MongoDB.Driver
StackTrace:
at MongoDB.Driver.OperationExecutor.<ExecuteReadOperationAsync>d__0`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at MongoDB.Driver.MongoCollectionImpl`1.<ExecuteReadOperation>d__5e`1.MoveNext()
我们很难重现这一点,触发几千次插入、更新和查找不会触发此错误。但是,运行 我们的 .NET Web 应用程序确实会触发此事件(在创建几个新实体之后)。
异常位置不同,但其中一个位置在我们的 FindAll 方法中。我们的代码:
IMongoCollection<BsonDocument> col = _database.GetCollection<BsonDocument>(GetCollectionName(qmoType));
IFindFluent<BsonDocument, BsonDocument> findFluent = col.Find(MongoDBWhereBuilder.BuildWhere(where));
findFluent = findFluent.Sort(SortBy.Ascending(sort.Keys.ToArray());
findFluent = findFluent.Skip(skip);
findFluent = findFluent.Limit(take);
List<BsonDocument> list = await findFluent.ToListAsync();
_database 变量在所有请求之间共享(它在启动时创建一次)。
我们怎样才能更好地解决这个问题?或者还有其他人有这个问题吗?
这是 beta2 驱动程序中的错误。该修复程序已合并到 master(和 beta3 的一部分)中:https://jira.mongodb.org/browse/CSHARP-1184
我认为这可能仍然存在于版本 2.0.1/2.1.0 中。我们不得不降级到 1.10.0,这是我们以前的版本,这使得连接数回到 100 以下,响应时间减少到 100 毫秒以下(有时从 500-600 毫秒)。
也许在导致延迟的异步代码周围的遗留包装器中有一些东西。
我们使用来自 MongoDB (2.0.0-beta2) 的最新测试版驱动程序,具有所有异步功能。但与旧实现 (1.10.0-rc0) 相比,我们遇到了一些奇怪的 TimeoutExceptions。我们尝试了不同的服务器版本(其中包括 3.0.0-rc10),但这似乎没有影响。
System.TimeoutException occurred
HResult=-2146233083
Message=Operation timed out after 00:00:30.
Source=MongoDB.Driver
StackTrace:
at MongoDB.Driver.OperationExecutor.<ExecuteReadOperationAsync>d__0`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at MongoDB.Driver.MongoCollectionImpl`1.<ExecuteReadOperation>d__5e`1.MoveNext()
我们很难重现这一点,触发几千次插入、更新和查找不会触发此错误。但是,运行 我们的 .NET Web 应用程序确实会触发此事件(在创建几个新实体之后)。
异常位置不同,但其中一个位置在我们的 FindAll 方法中。我们的代码:
IMongoCollection<BsonDocument> col = _database.GetCollection<BsonDocument>(GetCollectionName(qmoType));
IFindFluent<BsonDocument, BsonDocument> findFluent = col.Find(MongoDBWhereBuilder.BuildWhere(where));
findFluent = findFluent.Sort(SortBy.Ascending(sort.Keys.ToArray());
findFluent = findFluent.Skip(skip);
findFluent = findFluent.Limit(take);
List<BsonDocument> list = await findFluent.ToListAsync();
_database 变量在所有请求之间共享(它在启动时创建一次)。
我们怎样才能更好地解决这个问题?或者还有其他人有这个问题吗?
这是 beta2 驱动程序中的错误。该修复程序已合并到 master(和 beta3 的一部分)中:https://jira.mongodb.org/browse/CSHARP-1184
我认为这可能仍然存在于版本 2.0.1/2.1.0 中。我们不得不降级到 1.10.0,这是我们以前的版本,这使得连接数回到 100 以下,响应时间减少到 100 毫秒以下(有时从 500-600 毫秒)。
也许在导致延迟的异步代码周围的遗留包装器中有一些东西。