我正在使用Microsoft.Practice.TransientFaultHandling块进行重试逻辑。现在我将应用程序切换到.Net 4.8,并在SqlConnection的重试逻辑中使用新的构建。我想知道我是否需要一个特殊的重试逻辑为我的SqlCommand(我以前使用Polly),或者如果这也是内置的。当依赖于内置函数时,不可能记录重试,这使得测试非常困难。
Microsoft声明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);
}
}
}
}
1条答案
按热度按时间x33g5p2x1#
您的问题的答案是分析为什么您与数据库的连接打开了这么长时间,以至于它变得空闲并超时。ConnectRetryCount和ConnectRetryInterval属性允许您在服务器识别空闲连接失败后调整重新连接尝试。我将遵循Microsoft的建议:
Connection Pooling Recommendation
我们强烈建议您在使用完连接后始终关闭连接,以便连接返回到池中。您可以使用Connection对象的Close或Dispose方法,或者通过打开C#中的using语句或Visual Basic中的Using语句内的所有连接来执行此操作。未显式关闭的连接可能不会添加或返回到池中。有关详细信息,请参阅使用语句或如何:释放Visual Basic的系统资源。
打开您的连接,并在不再需要时关闭它们,如下所示:
希望能帮上忙。
编码愉快!!!