복붙노트

[MONGODB] MongoDB의 연결을 확인하는 방법

MONGODB

MongoDB의 연결을 확인하는 방법

나는 데이터베이스에 연결하여 MongoDB 드라이버를 사용합니다. 내 양식로드, 내가 연결을 설정하고 확인인지 여부를 확인하려는 경우. 나는 이런 식으로 작업을 수행합니다

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

하지만 연결을 확인하는 방법을 모르겠어요. 나는 시도 - 캐치이 코드를 중복하려고했으나 아무 소용이. 내가 잘못된를 ConnectionString을하더라도, 난 여전히 오류 메시지를받을 수 없습니다.

해결법

  1. ==============================

    1.그에 대한 핑 방법이있다 :

    그에 대한 핑 방법이있다 :

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

    2.새로운 3.0 드라이버는 사용하여 서버를 ping합니다 :

    새로운 3.0 드라이버는 사용하여 서버를 ping합니다 :

    var database = client.GetDatabase("YourDbHere");
    
    database.RunCommandAsync((Command<BsonDocument>)"{ping:1}")
            .Wait();
    
  3. ==============================

    3.2.4.3에 대한 완전한 예 - "client.GetServer은 ()"을 사용할 수 없습니다. "폴 엉덩이를 괴롭히는"답변에 따라.

    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
    }
    
  4. ==============================

    4.나는 OP와 같은 질문을했다, 모든 시도하고 각 솔루션은 내가 인터넷에서 찾을 수 있었다했습니다 ... 나는 MongoDB를 데이터베이스 서버에 연결이 살아있는 경우 검사의 신뢰성 및 대응 방법을 찾는 연구에 대한 거부했습니다 있도록 글쎄, 그들 중 누구도, 내 진정한 만족을 위해 일했다. 그리고이없이 너무 오랜 기간 동안 애플리케이션의 동기 실행을 차단하는 ...

    나는 OP와 같은 질문을했다, 모든 시도하고 각 솔루션은 내가 인터넷에서 찾을 수 있었다했습니다 ... 나는 MongoDB를 데이터베이스 서버에 연결이 살아있는 경우 검사의 신뢰성 및 대응 방법을 찾는 연구에 대한 거부했습니다 있도록 글쎄, 그들 중 누구도, 내 진정한 만족을 위해 일했다. 그리고이없이 너무 오랜 기간 동안 애플리케이션의 동기 실행을 차단하는 ...

    그래서 여기 내 전제 조건은 다음과 같습니다 :

    나는 기본 로컬 호스트 URL에 신선한 MongoDB를 설치 (버전 3.6)를 제공 한 : MongoDB를 : // localhost를 : 27,017. MongoDB를 : 나는 또한 더 MongoDB를 데이터베이스 서버가 없었다 다른 URL, 아래로 작성한 // 로컬 호스트 : 27,071.

    나는 또한 C #을 드라이버 2.4.4를 사용하고 있는데 (조립 MongoDB.Driver.Legacy)를 기존의 구현을 사용하지 마십시오.

    내가 두 번째 URL에 대한 연결을 확인하고있을 때 나의 기대는 그래서 내가 처음 URL에 대한 연결을 확인하고있을 때, 그것은 나에게 기존 MongoDB를 서버에 살아 연결에 대한 확인을 주어야한다, 그것은 나에게 주어야한다 존재하지 않는 MongoDB를 서버의 실패 ...

    IMongoDatabase.RunCommand의 방법을 사용하여 전제 조건에 대해 자격을하지, 서버를 조회 및 경과에 대한 서버 응답 시간 초과가 발생합니다. 또한, 타임 아웃 후, 추가의 예외 처리가 필요한 TimeoutException로 나누기.

    이 실제 SO의 질문이 SO 질문이를 위해 ... 남자 그래서, 많은 감사를 내 솔루션에 필요한 시작 정보 I의 가장 전달했다!

    내 솔루션을 지금 :

        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를 서버 proactivelly 연결된 모든 클라이언트의 클러스터 설명을 전파되지 않습니다. 보다는, 각각의 클라이언트는 서버에 대한 요청이 이루어진 경우에 대한 설명을 수신한다. 당신 동료 중 일부는이에 대한 자세한 정보가있는 경우, 하나 확인 또는 주제에 대한 나의 이해를 거부하시기 바랍니다 ...

    우리가 잘못된 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!"));
    

    인쇄한다

    및 (잘못된 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!"));
    

    인쇄한다

  5. ==============================

    5.핑 MongoDB를 서버에 다음은 간단한 확장 메서드

    핑 MongoDB를 서버에 다음은 간단한 확장 메서드

    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");
    
  6. ==============================

    6.당신이 당신의 프로그램에서 연결 문제를 처리하는 경우에 당신은 ICluster.Description 이벤트를 사용할 수 있습니다.

    당신이 당신의 프로그램에서 연결 문제를 처리하는 경우에 당신은 ICluster.Description 이벤트를 사용할 수 있습니다.

    MongoClient가 생성 될 때, 그것이 성공할 때까지 백그라운드에서 연결을 시도 할 것입니다.

    using MongoDB.Driver;
    using MongoDB.Driver.Core.Clusters;
    
    var mongoClient = new MongoClient("localhost")
    mongoClient.Cluster.DescriptionChanged += Cluster_DescriptionChanged;
    
    public void Cluster_DescriptionChanged(object sender, ClusterDescriptionChangedEventArgs e)
    {
        switch (e.NewClusterDescription.State)
        {
            case ClusterState.Disconnected:
                break;
            case ClusterState.Connected:
                break;
        }
    }
    
  7. from https://stackoverflow.com/questions/28835833/how-to-check-connection-to-mongodb by cc-by-sa and MIT license