지난 1 주 정도 Azure SQL 데이터베이스에서 일시적 오류 처리를 구현하려고 시도했습니다. DB에 대한 작업 연결이 있지만 예상대로 일시적인 오류를 처리하고 있다고 확신하지는 않습니다.일시적인 오류 처리 (Azure)의 올바른 구현
지금까지 나의 접근 방식은 나는 Global.asax
년대에서 Application_Start()
을 그 메소드를 호출
public static void SetRetryStratPol()
{
const string defaultRetryStrategyName = "default";
var strategy = new Incremental(defaultRetryStrategyName, 3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
var strategies = new List<RetryStrategy> { strategy };
var manager = new RetryManager(strategies, defaultRetryStrategyName);
RetryManager.SetDefault(manager);
retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(strategy);
retryPolicy.Retrying += (obj, eventArgs) =>
{
var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
System.Diagnostics.Debug.WriteLine(msg);
};
}
을 포함하고있다. [
retryPolicy
의이 다음 방법을 포함한다 정적 클래스에 글로벌 정적 변수이다.]
이 그때 그때까지이 방법
using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
result = (int) cmd.ExecuteScalarWithRetry();
return View(result);
}
를 사용하는 방법
public static ReliableSqlConnection GetReliableConnection()
{
var conn = new ReliableSqlConnection("Server=...,1433;Database=...;User ID=...;Password=...;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;", retryPolicy);
conn.Open();
return conn;
}
을 가지고 이 작품. 그런 다음 재시도 정책을 테스트하기 위해 잘못된 사용자 이름 (here의 제안)을 사용해 보았습니다.
하지만 그 코드를 단계별로 때 커서가 즉시
로그인 내
catch
문으로 이동 '은 [내 이름]'사용자가 실패했습니다.
나는이 예외가 몇 초 후에 만 잡힐 것으로 예상했지만 지연은 전혀 발생하지 않았습니다.
또한, 정확하게 this post 다음에 Entity Framework를 사용해 보았지만 같은 결과가 나옵니다.
내가 무엇을 놓쳤는가? 구성 단계가 있습니까? 아니면 일시적인 오류를 잘못 유도합니까?
이것은 내 의혹 중 하나입니다. 그러나이 질문에서 언급 한 블로그 게시물은 6 개월 전 Azure MVP에 의해 작성되었으며 사용자 이름을 변경하여 재시도 정책을 유도 한 다음이 변경이 재시도 정책을 호출했다는 증거를 제공합니다. Transient Fault Handling에 대한 경험이 있으십니까? 다른 방법으로 테스트해볼 수 있습니까? – awj
내 대답이 업데이트되었습니다. HTH. –
소스 코드를 둘러 보았지만 찾지 못했습니다. 링크 덕분입니다. 나는 당신이 제안한 것처럼했고 내가 호출 한 오류 코드가 일시적인 오류로 간주되는 유형이 아니라는 사실을 발견했습니다. 그러나 RetryStrategy에 따라 IsTransient 메소드를 반복적으로 사용하고 있음을 알 수있었습니다. 그래서 ... 나는 지금 나의 OP의 코드가 유효하다는 것을 매우 만족하고 있으며, 나는 단지 그것을 잘못 트리거하고 검증하려고 시도하고있었습니다. 당신의 도움을 주셔서 감사합니다. – awj