MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Driver C# MongoDB Ignora le opzioni di timeout

C'è un biglietto JIRA CSHARP-1018 per tenere traccia di questo problema. Fondamentalmente il driver ignora l'opzione di timeout quando la macchina non è accessibile. Opzione di timeout viene ignorata se la macchina è spenta o non accessibile.

Fare riferimento al ticket JIRA per seguire i progressi su questo problema.

Consulta la soluzione alternativa pubblicata su CSHARP-1231 per un modo in cui ServerSelectionTimeout può essere impostato nell'attuale versione 2.0.0 del driver se si preferisce questo approccio all'utilizzo di timeout più brevi su operazioni specifiche.

Se stai utilizzando la nuova API asincrona 2.0, puoi utilizzare un token di annullamento per applicare il tuo timeout all'operazione complessiva.

Quindi consiglierei l'approccio del token di annullamento nel commento precedente. L'utilizzo di brevi timeout di selezione del server può comportare eccezioni spurie durante le elezioni del set di repliche se il timeout di selezione del server è inferiore al tempo necessario per il completamento di un'elezione.

Puoi scrivere qualcosa del genere:

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

In questo esempio, anche se ServerSelectionTimeout è ancora il valore predefinito di 30 secondi, questa particolare operazione verrà annullata dopo soli 500 millisecondi (circa, l'annullamento a volte può richiedere leggermente più tempo).