管理SQL Server连接

时间:2009-05-26 17:18:17

标签: c# .net sql-server connection-pooling sqlconnection

SQL连接的最佳做法是什么?

目前我正在使用以下内容:

using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING))
{
    sqlConn.Open();
    // DB CODE GOES HERE
}

我已经读过这是一种非常有效的SQL连接方式。默认情况下,SQL池是活动的,所以我理解的是,当using代码结束时,SqlConnection对象被关闭并处理,但是与DB的实际连接被放入SQL连接池中。我错了吗?

4 个答案:

答案 0 :(得分:14)

这就是大部分内容。还需要考虑一些其他要点:

  • 你在哪里获得连接字符串?您不希望在整个地方进行硬编码,您可能需要保护它。
  • 在您真正使用连接(SqlCommandSqlParameterDataSetSqlDataAdapter)和之前,您通常还要创建其他对象等待尽可能长时间打开连接。完整的模式需要考虑到这一点。
  • 您希望确保将数据库访问强制转换为自己的数据层类或程序集。所以常见的做法是将其表达为私有函数调用:

private static string connectionString = "load from encrypted config file";
private SqlConnection getConnection()
{
    return new SqlConnection(connectionString);
}

然后像这样写下你的样本:

using (SqlConnection sqlConn = getConnection())
{
    // create command and add parameters

    // open the connection
    sqlConn.Open();

   // run the command
}

该示例只能存在于您的数据访问类中。另一种方法是将其标记为internal并将数据层分布在整个程序集上。最重要的是严格执行数据库代码的清晰分离。

真正的实现可能如下所示:

public IEnumerable<IDataRecord> GetSomeData(string filter)
{
    string sql = "SELECT * FROM [SomeTable] WHERE [SomeColumn] LIKE @Filter + '%'";

    using (SqlConnection cn = getConnection())
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
        cn.Open();

        using (IDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                yield return (IDataRecord)rdr;
            }
        }
    }
}

请注意,我还能够“堆叠”cncmd对象的创建,从而减少嵌套并仅创建一个范围块。

最后,请注意在此特定示例中使用yield return代码。如果您调用该方法并且未立即完成DataBinding或其他用途,则可能会长时间保持连接打开状态。一个例子是使用它在ASP.NET页面的Load事件中设置数据源。由于实际的数据绑定事件直到以后才会发生,因此您可以将连接打开的时间比需要的时间长得多。

答案 1 :(得分:2)

Microsoft的Patterns and Practices库是处理数据库连接的绝佳方法。这些库封装了打开连接所涉及的大部分机制,这反过来又会让您的生活更轻松。

答案 2 :(得分:1)

您对使用的理解是正确的,并且建议使用该方法。您也可以在代码中调用close。

答案 3 :(得分:0)

另外:开放得很晚,很早就关闭。

在调用数据库之前没有剩下的步骤之前,请不要打开连接。完成后立即关闭连接。