web-dev-qa-db-ja.com

mongodbへの接続を確認する方法

MongoDBドライバーを使用してデータベースに接続します。フォームがロードされたら、接続を設定し、接続が正常かどうかを確認します。私はこのようにします:

var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
var database = server.GetDatabase("reestr");

しかし、接続を確認する方法がわかりません。このコードをtry-catchと重複させようとしましたが、役に立ちませんでした。誤ったconnectionStringを作成しても、エラーメッセージは表示されません。

24
Jacobian

そのための pingメソッド があります。

var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
server.Ping();
21
mnemosyn

新しい3.0ドライバーでサーバーをpingするには:

var database = client.GetDatabase("YourDbHere");

database.RunCommandAsync((Command<BsonDocument>)"{ping:1}")
        .Wait();
33
Paul Keister

2.4.3の完全な例-「client.GetServer()」は使用できません。 「ポール・ケイスター」の回答に基づいています。

client = new MongoClient("mongodb://localhost");
database = client.GetDatabase(mongoDbStr);
bool isMongoLive = database.RunCommandAsync((Command<BsonDocument>)"{ping:1}").Wait(1000);

if(isMongoLive)
{
    // connected
}
else
{
    // couldn't connect
}
16
Pav K.

私はOPと同じ質問を持っていて、インターネットで見つけることができるすべてのソリューションを試しました...まあ、どれも私の満足感にうまくいかなかったので、信頼できるものを見つけるための研究を選択しましたそして、MongoDBデータベースサーバーへの接続が生きているかどうかを確認するレスポンシブな方法。そして、これはアプリケーションの同期実行を長時間ブロックすることなく...

だからここに私の前提条件があります:

  • 接続チェックの同期処理
  • 接続チェックの短い時間スライスから非常に短い時間スライス
  • 接続チェックの信頼性
  • 可能であれば、例外をスローせず、タイムアウトをトリガーしません

デフォルトのローカルホストURLmongodb:// localhost:27017に新しいMongoDBインストール(バージョン3.6)を提供しました。 MongoDB Database Serverがなかった別のURLも書き留めました:mongodb:// localhost:27071

また、C#Driver 2.4.4を使用しており、notレガシー実装(MongoDB.Driver.Legacy Assembly)を使用します。

だから、最初のURLへの接続を確認するときに、接続を確認するときに、既存のMongoDBサーバーへの接続をOk 2番目のURLに、存在しないMongoDBサーバーのFailが表示されます...

IMongoDatabase.RunCommandメソッドを使用して、サーバーを照会し、サーバーの応答タイムアウトを経過させるため、前提条件を満たしていません。さらに、タイムアウト後、TimeoutExceptionで中断し、追加の例外処理が必要になります。

この実際のSO質問と this SO質問は、私のソリューションに必要なほとんどの開始情報を提供しました...みんな、これに感謝します!

今私の解決策:

    private static bool ProbeForMongoDbConnection(string connectionString, string dbName)
    {
        var probeTask = 
                Task.Run(() =>
                            {
                                var isAlive = false;
                                var client = new MongoDB.Driver.MongoClient(connectionString);

                                for (var k = 0; k < 6; k++)
                                {
                                    client.GetDatabase(dbName);
                                    var server = client.Cluster.Description.Servers.FirstOrDefault();
                                    isAlive = (server != null && 
                                               server.HeartbeatException == null && 
                                               server.State == MongoDB.Driver.Core.Servers.ServerState.Connected);
                                    if (isAlive)
                                    {
                                        break;
                                    }
                                    System.Threading.Thread.Sleep(300);
                                }
                                return isAlive;
                            });
        probeTask.Wait();
        return probeTask.Result;
    }

この背後にある考え方は、MongoDBサーバーは、サーバー上のリソース(データベースなど)にアクセスする実際の試みが行われるまで反応しない(存在しないように見える)ことです。ただし、サーバーにはまだサーバーのクラスター記述で状態の更新がないため、一部のリソースを取得するだけでは十分ではありません。リソースが再度取得されると、この更新が最初に行われます。この時点から、サーバーには有効なクラスターの説明と有効なデータが含まれています...

一般的に、MongoDBサーバーは、接続されているすべてのクライアントにクラスター記述をプロアクティブに伝達しません。むしろ、各クライアントは、サーバーへの要求が行われたときに説明を受け取ります。もしあなたの仲間の何人かがこれについてもっと情報を持っているなら、そのトピックに関する私の理解を確認するか拒否してください...

無効なMongoDBサーバーURLをターゲットにすると、クラスターの説明は無効なままになり、この場合に使用可能な信号をキャッチして配信できます...

したがって、次のステートメント(有効なURL)

// The admin database should exist on each MongoDB 3.6 Installation, if not explicitly deleted!
var isAlive = ProbeForMongoDbConnection("mongodb://localhost:27017", "admin");
Console.WriteLine("Connection to mongodb://localhost:27017 was " + (isAlive ? "successful!" : "NOT successful!"));

印刷します

Mongodb:// localhost:27017への接続は成功しました!

およびステートメント(無効なURLの場合)

// The admin database should exist on each MongoDB 3.6 Installation, if not explicitly deleted!
isAlive = ProbeForMongoDbConnection("mongodb://localhost:27071", "admin");
Console.WriteLine("Connection to mongodb://localhost:27071 was " + (isAlive ? "successful!" : "NOT successful!"));

印刷します

Mongodb:// localhost:27071への接続は成功しませんでした!

2
Ramanagom

ここで、mongodbサーバーにpingを送信する簡単な拡張方法

public static class MongoDbExt
{
    public static bool Ping(this IMongoDatabase db, int secondToWait = 1)
    {
        if (secondToWait <= 0)
            throw new ArgumentOutOfRangeException("secondToWait", secondToWait, "Must be at least 1 second");

        return db.RunCommandAsync((Command<MongoDB.Bson.BsonDocument>)"{ping:1}").Wait(secondToWait * 1000);
    }
} 

次のように使用できます。

var client = new MongoClient("yourConnectionString");
var database = client.GetDatabase("yourDatabase");
if (!database.Ping())
    throw new Exception("Could not connect to MongoDb");
1
Iannick