MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

C# MongoDB-Treiber Ignoriert Timeout-Optionen

Es gibt ein JIRA-Ticket CSHARP-1018 um dieses Problem zu verfolgen. Grundsätzlich ignoriert der Treiber die Timeout-Option, wenn die Maschine nicht erreichbar ist. Die Timeout-Option wird ignoriert, wenn die Maschine ausgeschaltet oder nicht zugänglich ist.

Bitte lesen Sie das JIRA-Ticket, um den Fortschritt zu diesem Problem zu verfolgen.

Siehe die unter CSHARP-1231 gepostete Problemumgehung für eine Möglichkeit, dass ServerSelectionTimeout in der aktuellen Version 2.0.0 des Treibers eingestellt werden kann, wenn Sie diesen Ansatz der Verwendung kürzerer Timeouts bei bestimmten Vorgängen vorziehen.

Wenn Sie die neue asynchrone API 2.0 verwenden, können Sie ein Abbruch-Token verwenden, um Ihre eigene Zeitüberschreitung auf den Gesamtvorgang anzuwenden.

Daher würde ich den Cancellation Token-Ansatz im vorherigen Kommentar empfehlen. Die Verwendung kurzer Zeitüberschreitungen für die Serverauswahl kann zu unerwünschten Ausnahmen während der Auswahl von Replikatgruppen führen, wenn die Zeitüberschreitung für die Serverauswahl kürzer ist als die Zeit, die zum Abschluss einer Wahl benötigt wird.

Sie können so etwas schreiben:

var startTime = DateTime.UtcNow;
try
{
    using (var timeoutCancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(500)))
    {
        await collection.Find("{ _id : 1 }").ToListAsync(timeoutCancellationTokenSource.Token);
    }
}
catch (OperationCanceledException ex)
{
    var endTime = DateTime.UtcNow;
    var elapsed = endTime - startTime;
    Console.WriteLine("Operation was cancelled after {0} seconds.", elapsed.TotalSeconds);
}

Obwohl in diesem Beispiel das ServerSelectionTimeout immer noch der Standardwert von 30 Sekunden ist, wird dieser spezielle Vorgang nach nur 500 Millisekunden abgebrochen (ungefähr, der Abbruch kann manchmal etwas länger dauern).