簡體   English   中英

如何在C#MongoDB驅動程序v2.0中獲取連接狀態?

[英]How to get connection status in the C# MongoDB driver v2.0?

我們開始使用新的MongoDB驅動程序v2 ,我們無法理解我們是否連接到數據庫。

我們的存儲庫代碼

var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}");
var database = client.GetDatabase(url.DatabaseName);

wrong-hostwrong-port是無效值。

首先,我們認為如果沒有人正在監聽指定的地址但驅動程序沒有拋出異常將被引發。

下一步是在db上調用方法:

var dbs = client.ListDatabasesAsync().Result.ToListAsync().Result;

在這里,我們有freez 30秒而不是例外。 我們不適合等待30秒來了解我們是否聯系。

System.TimeoutException:使用CompositeServerSelector選擇服務器30000ms后發生超時{Selectors = ReadPreferenceServerSelector {ReadPreference = {Mode = Primary,TagSets = []}},LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}。 集群狀態的客戶端視圖是{ClusterId:“1”,類型:“未知”,狀態:“已斷開連接”,服務器:[{ServerId:“{ClusterId:1,EndPoint:”****“}”,EndPoint: “****”,狀態:“Disconnected”,鍵入:“Unknown”,HeartbeatException:“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;
}

用法

database = Connect(connectionString, TimeSpan.FromSeconds(1));

問題有下一個解決方法:

var client = new MongoClient(new MongoClientSettings
{
       Server = new MongoServerAddress("xxxx"),
       ClusterConfigurator = builder =>
       {
             builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(10)));
       }
});

使用新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);
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM