【问题标题】:Is it safe to rely on SqlConnection retry logic while using SqlCommand?使用 SqlCommand 时依赖 SqlConnection 重试逻辑是否安全?
【发布时间】: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


【解决方案1】:

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

Connection Pooling Recommendation

我们强烈建议您在访问时始终关闭连接 完成使用它,以便连接将返回到 水池。您可以使用 Close 或 Dispose 方法执行此操作 连接对象,或通过打开使用中的所有连接 C# 中的语句,或 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;
}

希望对您有所帮助。

编码愉快!!!

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2013-06-03
    相关资源
    最近更新 更多