如何在C#MongoDB驱动程序v2.0中获取连接状态?
我们开始使用新的,我们不知道我们是否连接到数据库 我们的存储库代码:如何在C#MongoDB驱动程序v2.0中获取连接状态?,c#,mongodb,mongodb.driver,C#,Mongodb,Mongodb.driver,我们开始使用新的,我们不知道我们是否连接到数据库 我们的存储库代码: var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}"); var database = client.GetDatabase(url.DatabaseName); 其中错误的主机和错误的端口是无效值 首先,我们认为若并没有人监听指定的地址,但驱动程序并没有抛出异常,那个么会引发异常 下一步是调用数据库上的方法: var dbs
var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}");
var database = client.GetDatabase(url.DatabaseName);
其中错误的主机
和错误的端口
是无效值
首先,我们认为若并没有人监听指定的地址,但驱动程序并没有抛出异常,那个么会引发异常
下一步是调用数据库上的方法:
var dbs = client.ListDatabasesAsync().Result.ToListAsync().Result;
在这里,我们有30秒的自由,比例外。我们不适合等待30秒来了解我们是否已连接
System.TimeoutException:选择一个
使用CompositeServerSelector{Selectors的服务器=
ReadPreferenceServerSelector{ReadPreference={Mode=Primary,
标记集=[]},LatencyMitingServerSelector{AllowedLatencyRange=
00:00:00.0150000 } }. 群集状态的客户端视图为{ClusterId:
“1”,类型:“未知”,状态:“已断开”,服务器:[{ServerId:
{ClusterId:1,端点:*****},端点:*****,状态:
“断开连接”,类型:“未知”,异常:
“MongoDB.Driver.MongoConnectionException:运行时发生异常
正在打开与服务器的连接。-->
System.Net.Sockets.SocketException:无法建立连接
因为目标机器主动拒绝了它******
最后,我们尝试设置不同的超时,但没有改变
var client = new MongoClient(new MongoClientSettings
{
SocketTimeout = TimeSpan.FromSeconds(1),
MaxConnectionIdleTime = TimeSpan.FromSeconds(1),
MaxConnectionLifeTime = TimeSpan.FromSeconds(1),
ConnectTimeout = TimeSpan.FromSeconds(1),
Servers = url.Servers
});
所以问题是我们如何在短时间间隔(1-2秒)内知道我们是否连接到mongo
[UPD]
我们目前的解决方案是:
private IMongoDatabase Connect(string connectionString, TimeSpan timeout)
{
var url = MongoUrl.Create(connectionString);
var client = new MongoClient(url);
var db = client.GetDatabase(url.DatabaseName);
var pingTask = db.RunCommandAsync<BsonDocument>(new BsonDocument("ping", 1));
pingTask.Wait(timeout);
if (pingTask.IsCompleted)
log.InfoFormat("Connected to: {0}.", connectionString);
else
throw new TimeoutException(string.Format("Failed to connect to: {0}.", connectionString));
return db;
}
下一个解决方法是: 使用新的API:
try
{
MongoClient client = new MongoClient("xxx");
// if you're running localhost let the parameter empty
var db = client.GetDatabase("dbName");
var collection = db.GetCollection<BsonDocument>("collectionName");
var filter1 = Builders<BsonDocument>.Filter.Empty;
var filter = new BsonDocument();
var count = 0;
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
count++;
}
}
}
MessageBox.Show(count.ToString());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
试试看
{
MongoClient=新的MongoClient(“xxx”);
//如果您正在运行localhost,请将参数设置为空
var db=client.GetDatabase(“dbName”);
var collection=db.GetCollection(“collectionName”);
var filter1=Builders.Filter.Empty;
var filter=新的BsonDocument();
var计数=0;
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量var文档)
{
计数++;
}
}
}
Show(count.ToString());
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
您的客户端代码必须能够处理不可靠的网络,请记住,每一次网络操作都可能发生超时。请让您的代码具有抵御这些问题的能力。即使您刚刚验证了连接是否正常,也可能会在一毫秒后断开,而这忽略了连接池的复杂性和奇怪的路由问题、数据包丢失等。对于初始连接,您的解决方案可能有效,但不必要地严格,很难保证小于1s(网络拥塞、服务器繁忙、连接池已满等)
var client = new MongoClient(new MongoClientSettings
{
Server = new MongoServerAddress("xxxx"),
ClusterConfigurator = builder =>
{
builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(10)));
}
});
try
{
MongoClient client = new MongoClient("xxx");
// if you're running localhost let the parameter empty
var db = client.GetDatabase("dbName");
var collection = db.GetCollection<BsonDocument>("collectionName");
var filter1 = Builders<BsonDocument>.Filter.Empty;
var filter = new BsonDocument();
var count = 0;
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
count++;
}
}
}
MessageBox.Show(count.ToString());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}