Chcę napisać kod opakowania do wywołań w bazie danych (przy użyciu języka C# i technologii firmy Microsoft służących do uzyskiwania dostępu do bazy danych), automatycznie ponawiając próby przy wyjątku "przejściowym". Przez przemijające, mam na myśli to, że istnieje duża szansa, że ostatecznie rozwiąże to (wbrew logicznym błędom, które nigdy nie zadziałają). Przykłady, które mogę myśleć to:Numery wyjątków przejściowych serwera SQL
- Deadlock
- Connection Timeout
- Timeout Polecenie
ja zaplanowałem na wykorzystaniu numerów błędów SQLException w celu wykrycia tych. Tak więc na przykład:
List<RunStoredProcedureResultType> resultSet = null;
int limit = 3;
for (int i = 0; i < limit; ++i)
{
bool isLast = i == limit - 1;
try
{
using (var db = /* ... */)
{
resultSet = db.RunStoredProcedure(param1, param2).ToList();
}
//if it gets here it was successful
break;
}
catch (SqlException ex)
{
if (isLast)
{
//3 transient errors in a row. So just kill it
throw;
}
switch (ex.Number)
{
case 1205: //deadlock
case -2: //timeout (command timeout?)
case 11: //timeout (connection timeout?)
// do nothing - continue the loop
break;
default:
//a non-transient error. Just throw the exception on
throw;
}
}
Thread.Sleep(TimeSpan.FromSeconds(1)); //some kind of delay - might not use Sleep
}
return resultSet;
(. Przepraszam za ewentualne błędy - Właśnie napisane, że w locie ja też sobie sprawę, mogę owinąć go ładnie ...)
więc kluczową kwestią jest : jakie liczby powinienem uważać za "przejściowy" (zdaję sobie sprawę z tego, co uważam za przejściowe może być inne od tego, co inni uważają za przejściowe). Znalazłem ładną listę tutaj:
https://msdn.microsoft.com/en-us/library/cc645603.aspx
ale jego masywny i pamiętać, bardzo przydatne. Czy ktoś inny zbudował listę, której używają do czegoś podobnego?
UPDATE
W końcu zdecydowaliśmy się na „liście złych” - jeśli błąd jest jednym z listą znanych „non-nieustalonych błędów” - które są zazwyczaj błędy programistyczne. Podaję listę numerów, których używamy jako odpowiedzi.
zrobiliśmy coś podobnego. nazwał to "możliwymi do odzyskania wyjątkami". w tym błędy łączności, limity czasu i zakleszczenia. ale: zakleszczenia najprawdopodobniej wytrwają, gdy trzykrotnie powtórzysz połączenie - rozważ dodanie zmiennego opóźnienia lub innych metod rozwiązywania zakleszczeń. a przekroczenie limitu czasu połączenia z powodu przeciążenia może się jeszcze pogorszyć, gdy natychmiast wykonasz dwie próby. – dlatikay
O tak, zaplanowałem opóźnienie. Dzięki @dlatikay - zaktualizuje powyższe – thab
Witam, prosisz o rekomendację, niestety nie jest to rozwiązanie, ponieważ każdy programista może mieć inne zdanie na temat tego, co byłoby przydatne dla twojego przypadku, więc ze sposobem, w jaki jest obecnie redagowany nie ma tematu; pozdrowienia. – jclozano