ここ 1 日ほど、Azure SQL データベースに一時的な障害処理を実装しようと試みてきました。DB への接続は機能していますが、一時的な障害が期待どおりに処理されているかどうかはわかりません。
これまでのところ、私のアプローチには
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);
};
}
そのメソッドを から呼び出しGlobal.asax
ますApplication_Start()
。[retryPolicy
は、この次のメソッドも含む静的クラスのグローバル静的変数です。]
それから私は方法を持っています
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;
}
次に、この方法を使用します
using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
result = (int) cmd.ExecuteScalarWithRetry();
return View(result);
}
これまでのところ、これは機能します。次に、再試行ポリシーをテストするために、間違ったユーザー名を使用してみました (ここからの提案)。
しかし、そのコードをステップ実行すると、カーソルはすぐにcatch
ステートメントにジャンプします
ユーザー「[自分のユーザー名]」のログインに失敗しました。
この例外は数秒後にのみキャッチされると予想していましたが、遅延はまったく発生しません。
さらに、この投稿に正確に従って、Entity Frameworkでも試しましたが、同じ結果が得られます。
私は何を逃したのですか?構成手順はありますか、それとも誤って一時的な障害を引き起こしていますか?