使用(SqlConnection),范围和连接池

时间:2014-04-07 11:16:49

标签: c# sql sqlconnection

我最近刚刚了解到这种连接池机制,并发现我编写的SQL连接错误。我曾经维护一个全局SQL连接,所有SqlCommands都将执行。

所以我现在正在对现有代码进行大规模更改。参与全球SqlCommands的{​​{1}}不少于260 SqlConnection我现在正在忙着

using (SqlConnection sqlConnection = new SqlConnection(globally_stored_connection_string))
{
    sqlConnection.Open();
    // SqlCommand comes here
}

我认为它仍然是我必须做出的一种范式转换,这种关闭连接的业务只是在不久之后开启一个新的连接,信任连接池来处理开销。考虑到这一点,我现在需要决定如何在循环内多次调用SqlCommands。非常感谢您对以下哪些代码段的首选(当然,我的SqlCommands还有更多内容,而不仅仅是这些,但这些是用来说明问题的简单示例)。

选项A:

using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
    foreach(int number in numberList)
    {
        using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
        {
            sqlConnection.Open();
            sqlCommand.ExecuteNonQuery();
        }
    }
}

选项B:

foreach (int number in numberList)
{
    using (SqlConnection sqlConnection = new SqlConnection(connection_string))
    {
        sqlConnection.Open();
        using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
        {
            sqlCommand.ExecuteNonQuery();
        }
    }
}

2 个答案:

答案 0 :(得分:7)

我认为你缺少选项C,这对我来说最有意义:

using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
    sqlConnection.Open();
    using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
    {
        foreach (int number in numberList)
        {
            //Modify command parameters if needed
            sqlCommand.ExecuteNonQuery();
        }
    }
}

执行命令的开销最小。构造SqlCommand对象不是非常昂贵,但它也不是免费的。如果可能的话,我们可以在这里重复使用它。

答案 1 :(得分:1)

我会去

using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
    sqlConnection.Open();
    foreach(int number in numberList)
    {
        using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
        {
            sqlCommand.ExecuteNonQuery();
        }
    }
}

您只需在此代码块中打开一次连接。

尽管在完成连接后立即关闭连接是很好的,但您不必将其置于极端并为每个事务打开连接。如果您一个接一个地执行几个命令,就足以打开它一次。即使使用连接池,打开新连接也会产生一些开销。如果你不把它留在那么那就足够了。