我正在使用 .NET 驱动程序在我的 .NET 应用程序中查询 Mongo。我正在使用存储库模式。有时,
FindAsync()
、FindOneAndReplaceAsync()
、UpdateOneAsync()
方法需要 25 分钟以上才能完成。
我在 Mongodb 上运行了一个分析器来处理超过 2000 毫秒的查询,但我看到的这些查询都不存在。
我在新遗迹中找到了这个。这是一个间歇性的问题。分享下面的代码,请帮我弄清楚。
忽略取消令牌,我不会通过它来解决此问题。
使用 .NET 与
"MongoDB.Driver" Version="2.23.1"
// connectionstirng
"ConnectionString": "abc.in:21011/abc&directConnection=true&serverSelectionTimeoutMS=600000"
// Calling methods
var data = await _mongoDb.GetAsync(x => x.CoRelationId == cid, token);
await _mongoDb.AddUpdate(log);
public MongoLogRepo(IOptions<MongoDatabaseSettings> MongoDbSettings)
{
var mongoClient = new MongoClient(MongoDbSettings.Value.ConnectionString);
var mongoDatabase = mongoClient.GetDatabase(MongoDbSettings.Value.DatabaseName);
_mongoRepo = mongoDatabase.GetCollection<Nhcx_Mongo_Log>(
MongoDbSettings.Value.NhcxCollectionName);
_mongoRepoProfile = mongoDatabase.GetCollection<ProfileCache>(
MongoDbSettings.Value.ProfileCollectionName);
}
//public async Task<List<Nhcx_Mongo_Log>> GetAsync() =>
// await _mongoRepo.Find(_ => true).ToListAsync();
public async Task<List<Nhcx_Mongo_Log>> GetAsync(string id) =>
await _mongoRepo.Find(x => x._Id == id).ToListAsync();
public async Task<List<Nhcx_Mongo_Log>> GetAsync(Expression<Func<Nhcx_Mongo_Log, bool>> predicate, CancellationToken token)
{
try
{
return await _mongoRepo.Find(predicate).ToListAsync();
}
catch (OperationCanceledException)
{
Console.WriteLine("Operation cancelled");
}
return new List<Nhcx_Mongo_Log>();
}
public async Task<bool> Update(string id, Dictionary<string, object>value)
{
try
{
Console.WriteLine($" {DateTime.Now} in Mongo update");
var updList = new List<UpdateDefinition<Nhcx_Mongo_Log>>();
foreach (var kvp in value)
{
updList.Add(Builders<Nhcx_Mongo_Log>.Update.Set(kvp.Key, kvp.Value));
}
var final = Builders<Nhcx_Mongo_Log>.Update.Combine(updList);
var updateResult = await _mongoRepo.UpdateOneAsync(rec => rec._Id == id, final)
.ConfigureAwait(false);
return updateResult.IsAcknowledged &&
updateResult.ModifiedCount > 0;
}
catch (Exception ex)
{
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(ex));
throw new Exception ("Error while updating the Mongo "+ Newtonsoft.Json.JsonConvert.SerializeObject(ex));
}
}
public async Task<bool> AddUpdate(Nhcx_Mongo_Log record)
{
if (record != null && !string.IsNullOrEmpty(record.CoRelationId))
{
try
{
var updateRecord = await _mongoRepo.FindOneAndReplaceAsync(x => x.CoRelationId == record.CoRelationId, record);
if (updateRecord == null)
await _mongoRepo.InsertOneAsync(record);
return true;
}
catch (Exception ex)
{
throw new Exception("Mongo db transaction failed");
}
}
return false;
}
public Task<List<ProfileCache>>? FetchProfileAsync<T>(Expression<Func<ProfileCache, bool>> predicate)
{
return _mongoRepoProfile.Find(predicate).ToListAsync();
}
public void AddProfiles(List<ProfileCache> profile)
{
_mongoRepoProfile.InsertMany(profile);
}
将其写为答案,因为它相当大:
备注:
directConnection=true
,除非您知道需要它的具体原因(请参阅一些详细信息此处)serverSelectionTimeoutMS
类似的故事。没有理由将此值设置为 10 分钟。将此选项与 directConnection=true
结合使用将导致您的驱动程序等待至少 10 分钟才能了解您当前的服务器不可用,这很可能是您的情况发生的情况。因此,我认为您等待的所有时间很可能是您的司机试图寻找服务器的时间。鉴于 directconnection=true
禁用故障转移功能,那么它永远不会发生。This is an intermittent issue
- 这种情况发生的频率如何?与其他案例有什么不同?CommandSuccededEvent
上订阅并分析持续时间字段