【发布时间】:2020-06-11 04:31:51
【问题描述】:
我使用 Microsoft.Practice.TransientFaultHandling 块进行重试逻辑。 现在我将我的应用程序切换到 .Net 4.8 并为 SqlConnection 使用新构建的重试逻辑。 我想知道我是否需要为我的 SqlCommand(我之前使用过 Polly)提供特殊的重试逻辑,或者这是否也是内置的。依赖内置函数时不可能记录重试,这使得测试非常困难。
微软声明here:
“有一个微妙之处。如果在查询时发生暂时性错误 正在执行,您的 SqlConnection 对象不会重试连接 手术。它当然不会重试您的查询。然而, SqlConnection 在发送之前非常快速地检查连接 查询执行。如果快速检查检测到连接问题, SqlConnection 重试连接操作。如果重试成功, 您的查询已发送执行。”
我只是通过在重试时间范围内断开和重新连接互联网来测试这一点,我的命令在一段时间后被执行。 所以它似乎适用于这个简单的场景。但是依赖这个真的安全吗,还是我仍然需要为我的 SqlCommand 实现重试逻辑?
这是我的代码:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectRetryCount = 5;
builder.ConnectRetryInterval = 3;
MyDataSet m_myDataSet = new MyDataSet();
using (SqlConnection sqlConnection = new SqlConnection(builder.ConnectionString))
{
try
{
sqlConnection.Open();
}
catch (SqlException sqlEx)
{
// do some logging
return false;
}
try
{
using (SqlCommand cmd = new SqlCommand(selectCmd, sqlConnection))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(m_myDataSet, tableName);
}
}
}
}
【问题讨论】:
-
这个问题太开放了,我的意思是,是的,它确实有效,是的,它会重试瞬态类型错误,是否存在它可能无法处理的错误?好吧,这是有保证的。你到底想知道什么
标签: c# winforms azure-sql-database sqlconnection retry-logic