如何让Dapper对SqlAzure有弹性?

时间:2014-12-08 11:44:02

标签: azure-sql-database dapper resiliency

我最近发现实体框架有一种非常简单的方法可以在SQL Azure中实现连接弹性。是否有推荐的方法在Dapper中完成同样的工作?

1 个答案:

答案 0 :(得分:12)

防止C#中针对Azure的连接问题的最快方法是Microsoft Transient Fault Handling Block

例如,在尝试打开与Windows Azure SQL数据库的连接时,下面的代码将重试最多3次,间隔为1秒:

var retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(1));

var retryPolicy = 
  new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);

retryPolicy.ExecuteAction(() => myConnection.Open());

FixedInterval是后退政策,所以它会尝试,等待1秒,再试一次等​​等,直到它尝试了3次。

SqlDatabaseTransientErrorDetectionStrategy只是对抛出的异常进行检查,如果它是应该重试的连接异常,它会告诉RetryPolicy再次执行操作。如果它不是连接异常,则不会执行该操作,并且将正常抛出原始异常。

至于什么时候应该和Dapper一起使用;您可以安全地重试打开连接和读取操作,但是要注意或重试写入操作,因为存在重复插入,尝试删除行等两次的风险等。

更多细节here,此库可以作为NuGet Package here找到,其中包含Windows Azure的检测策略。