我们目前正在使用ReliableSqlConnection来调用我们的Azure SQL数据库。这很好用。 但不幸的是,企业库是从2013年开始的,似乎不再开发了。但主要问题是,不支持 async db调用。
我一直在寻找SO和其他地方,但到目前为止我唯一能找到的就是波莉。甚至Polly似乎没有被广泛使用,我还没有找到SQL Server的例子。 我知道ADO.NET支持重试SqlConnection.Open(),但不支持重命令,因此它不是真正的解决方案。我有点惊讶,我们似乎是唯一有这个问题的人吗?
答案 0 :(得分:2)
鲜为人知的事实是,瞬态容错现在内置于连接字符串(.NET 4.6.1+)中。 This document说:
如果您的客户端程序使用.NET Framework类
System.Data.SqlClient.SqlConnection
连接到Azure SQL数据库,您应该使用.NET 4.6.1或更高版本(或.NET Core),以便您可以利用它连接重试功能。 Details of the feature are here。为
SqlConnection
对象构建连接字符串时,应协调以下参数之间的值:
ConnectRetryCount
(默认值为1.范围是0到255.)
ConnectRetryInterval
(默认值为1秒。范围为1到60.)
Connection Timeout
(默认值为15秒。范围为0到2147483647)具体而言,您选择的值应使以下等式为真:
Connection Timeout = ConnectRetryCount * ConnectionRetryInterval
例如,如果count = 3,interval = 10秒,则只有29秒的超时不会给系统足够的时间进行第3次和最后的连接重试:29< 3 * 10.
答案 1 :(得分:1)
我在eShopOnContainers项目中看到了一个很好的Polly用法示例(关于如何开发微服务架构的演示......)
嗯,正在使用Circuit Breaker实现,(看看这里:https://github.com/dotnet-architecture/eShopOnContainers/tree/dev/src/Web/WebMVC/Infrastructure),我会说,就像他们使用HTTP连接消费休息一样,你也可以用你的异步SQL连接......
正在使用它:
if (Configuration.GetValue<string>("UseResilientHttp") == bool.TrueString)
{
services.AddSingleton<IResilientHttpClientFactory, ResilientHttpClientFactory>();
services.AddSingleton<IHttpClient, ResilientHttpClient>(sp => sp.GetService<IResilientHttpClientFactory>().CreateResilientHttpClient());
}
else
{
services.AddSingleton<IHttpClient, StandardHttpClient>();
}
所以你可以创建ResilientSqlClient并以类似的方式使用它。
我希望它可以帮助您解决这个问题。
答案 2 :(得分:0)
您是否按照here所解释的那样尝试了Async和Await模式?
希望这有帮助。