awj*_*awj 4 c# dbconnection azure azure-sql-database
在过去的一天左右,我一直在尝试在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);
};
}
Run Code Online (Sandbox Code Playgroud)
我从Global.asax
's中调用那个方法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;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用这种方法
using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
result = (int) cmd.ExecuteScalarWithRetry();
return View(result);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是有效的.然后,为了测试重试策略,我尝试使用错误的用户名(来自此处的建议).
但当我单步执行该代码时,光标会立即跳转到我的catch
语句中
用户'[我的用户名]'登录失败.
我原以为这个例外只会在几秒钟之后被捕获,但根本不会发生延迟.
此外,我也尝试过实体框架,完全按照这篇文章,但得到相同的结果.
我错过了什么?是否有配置步骤或我是否错误地引发了瞬态故障?
Gau*_*tri 11
瞬态故障处理块用于处理瞬态错误.由于用户名/密码不正确而导致登录失败肯定不是其中之一.从这个网页:http://msdn.microsoft.com/en-us/library/dn440719%28v=pandp.60%29.aspx:
什么是瞬态故障?
当应用程序使用服务时,由于临时条件(如间歇性服务,基础结构级故障,网络问题或服务的显式限制),可能会发生错误; 基于云的服务会更频繁地发生这些类型的错误,但也可能在内部部署解决方案中发生.如果稍后重试操作(可能仅在几毫秒之后),操作可能会成功.这些类型的错误条件称为瞬态故障.瞬态故障通常很少发生,并且在大多数情况下,操作成功只需要几次重试.
您可能需要检查此应用程序块的源代码(http://topaz.codeplex.com/),并查看从SQL数据库返回的错误代码被视为瞬态错误,从而重试.
您始终可以扩展功能并将登录失败作为测试代码的瞬态错误之一.
UPDATE
请查看源代码:http://topaz.codeplex.com/SourceControl/latest#source/Source/TransientFaultHandling.Data/SqlDatabaseTransientErrorDetectionStrategy.cs.这是重试魔法发生的地方.你可以做的是创建一个类(让我们调用它CustomSqlDatabaseTransientErrorDetectionStrategy
)并将链接中的整个代码复制到这个类中.然后出于测试目的,您可以将login failed
场景添加为瞬态错误之一,并在您的应用程序中使用此类而不是SqlDatabaseTransientErrorDetectionStrategy
.
归档时间: |
|
查看次数: |
6357 次 |
最近记录: |