0

我正在使用 Microsoft.Practice.TransientFaultHandling 块进行重试逻辑。现在我将我的应用程序切换到 .Net 4.8 并为 SqlConnection 使用新构建的重试逻辑。我想知道我是否需要为我的 SqlCommand(我之前使用过 Polly)提供特殊的重试逻辑,或者这是否也是内置的。依赖内置函数时不可能记录重试,这使得测试非常困难。

微软在这里声明:

“有一个微妙之处。如果在执行查询时发生暂时性错误,您的 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);
                }                          
        }
    }           
}
4

1 回答 1

0

您的问题的答案是分析为什么您与数据库的连接打开时间如此之长以至于它处于空闲状态并超时。ConnectRetryCount 和 ConnectRetryInterval 属性允许您在服务器识别空闲连接失败后调整重新连接尝试。我会遵循微软对此的建议:

连接池建议

我们强烈建议您在使用完连接后始终关闭连接,以便将连接返回到池中。您可以使用 Connection 对象的 Close 或 Dispose 方法,或者通过在 C# 中的 using 语句或 Visual Basic 中的 Using 语句中打开所有连接来执行此操作。未明确关闭的连接可能不会添加或返回到池中。有关详细信息,请参阅使用语句或如何:处置 Visual Basic 的系统资源。

打开您的连接并在不再需要时关闭它们,如下所示:

MyDataSet m_myDataSet = new MyDataSet();

try
{
    using (SqlConnection sqlConnection = new SqlConnection(ConnectionString))
    {
        sqlConnection.Open();

        using (SqlCommand cmd = new SqlCommand(selectCmd, sqlConnection))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                da.Fill(m_myDataSet, tableName);
            }
        }
    }
}
catch (SqlException sqlEx)
{
    // do some logging
    return false;
}

希望有帮助。

快乐编码!!!

于 2020-02-27T09:16:35.867 回答