winforms 使用SqlCommand时依赖SqlConnection重试逻辑是否安全?

vhipe2zx  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在使用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);
                }                          
        }
    }           
}
x33g5p2x

x33g5p2x1#

您的问题的答案是分析为什么您与数据库的连接打开了这么长时间,以至于它变得空闲并超时。ConnectRetryCount和ConnectRetryInterval属性允许您在服务器识别空闲连接失败后调整重新连接尝试。我将遵循Microsoft的建议:
Connection Pooling Recommendation
我们强烈建议您在使用完连接后始终关闭连接,以便连接返回到池中。您可以使用Connection对象的Close或Dispose方法,或者通过打开C#中的using语句或Visual Basic中的Using语句内的所有连接来执行此操作。未显式关闭的连接可能不会添加或返回到池中。有关详细信息,请参阅使用语句或如何:释放Visual Basic的系统资源。
打开您的连接,并在不再需要时关闭它们,如下所示:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectRetryCount = 5;
builder.ConnectRetryInterval = 3;

bool updateSuccess = true;

MyDataSet m_myDataSet = new MyDataSet();
using (SqlConnection sqlConnection = new SqlConnection(builder.ConnectionString))
{
    try
    {
        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 (avoid exceptions here)
        updateSuccess = false;
    }
    finally
    {
        sqlConnection.Close();
    }
}

return updateSuccess;

希望能帮上忙。
编码愉快!!!

相关问题