it-source

mongodb에 대한 연결을 확인하는 방법

criticalcode 2023. 5. 21. 11:38
반응형

mongodb에 대한 연결을 확인하는 방법

사용합니다MongoDB데이터베이스에 연결할 드라이버입니다.폼이 로드되면 연결을 설정하고 괜찮은지 확인하려고 합니다.저는 이렇게 합니다.

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

하지만 나는 연결을 확인하는 방법을 모릅니다.이 코드를 오버랩하려고 했습니다.try-catch하지만 소용이 없습니다.connectionString을 잘못해도 오류 메시지가 나타나지 않습니다.

새 3.0 드라이버로 서버를 ping하려면 다음을 수행합니다.

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

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

PING 방법이 있습니다.

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

2.4.3의 전체 예 - 여기서 "client"."Paul Keister" 답변에 따라 "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
}

저는 OP와 같은 질문을 받았고, 인터넷에서 찾을 수 있는 모든 해결책을 시도했습니다.그 중 어느 것도 제 진정한 만족감을 주지 못했기 때문에, 저는 MongoDB 데이터베이스 서버에 대한 연결이 활성화되어 있는지 확인할 수 있는 신뢰할 수 있고 응답성이 높은 방법을 찾기 위해 연구를 선택했습니다.애플리케이션의 동기식 실행을 너무 오랫동안 차단하지 않고도...

제 전제 조건은 다음과 같습니다.

  • 연결 검사의 동기 처리
  • 연결 확인을 위한 짧은 시간에서 매우 짧은 시간 슬라이스
  • 연결 확인의 신뢰성
  • 가능한 경우 예외를 던지지 않고 시간 초과를 트리거하지 않음

기본 localhost URL: mongodb://localhost:27017에 새로운 MongoDB 설치(버전 3.6)를 제공했습니다.MongoDB Database Server가 없었던 다른 URL도 적어 두었습니다: mongodb://localhost:27071.

저도 C# Driver 2.4.4를 사용하고 있으며 레거시 구현(MongoDB)을 사용하지 않습니다.드라이버.레거시 어셈블리).

따라서 첫 번째 URL에 대한 연결을 확인할 때 기존 MongoDB 서버에 대한 활성 연결에 대한 OK가 표시되고 두 번째 URL에 대한 연결을 확인할 때 존재하지 않는 MongoDB 서버에 대한 Fail이 표시됩니다.

IMongo 데이터베이스 사용.RunCommand 메서드는 서버를 쿼리하고 서버 응답 시간 제한을 초과하므로 필수 구성 요소에 대해 적합하지 않습니다.또한 시간 초과 후에는 시간 초과와 함께 중단됩니다.예외. 추가 예외 처리가 필요합니다.

이 실제 SO 질문과 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에 연결하지 못했습니다!

여기 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");

이것은 트라이캐치 접근법을 사용한 해결책입니다.

var database = client.GetDatabase("YourDbHere");
bool isMongoConnected;
try
{
     await database.RunCommandAsync((Command<BsonDocument>)"{ping:1}");
     isMongoConnected = true;
}
catch(Exception)
{
    isMongoConnected = false;
}    

그래서 그것이 데이터베이스에 연결하지 못할 때, 그것은 예외를 던질 것이고 우리는 거기서 우리의 부울 플래그를 다룰 수 있습니다.

프로그램에서 연결 문제를 처리하려면 이벤트를 사용할 수 있습니다.

를 만들면 성공할 때까지 백그라운드에서 연결을 계속 시도합니다.

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;
    }
}

언급URL : https://stackoverflow.com/questions/28835833/how-to-check-connection-to-mongodb

반응형