Asp.net连接太多

时间:2012-03-22 15:40:50

标签: asp.net asp.net-mvc-3 sql-server-2005 idisposable

我正在将Foxpro迁移到ASP.NET MVC应用程序。

近70%的逻辑嵌入在SqlServer存储过程中。因此我们使用一些程序来更新一些表(我们不映射SP,只使用SqlDataReader,SqlCommand,SqlAddapter调用它们。)

问题是每次通话都会打开很多连接。即使这样,每次通话都会关闭连接。当运行sp_who时,似乎为同一用户打开了许多连接。

当前关闭和处理每个连接的方式是什么?

可以找到活动连接并重复使用吗?

最后一次尝试是:

SqlConnection.ClearAllpools();

但它不会立即生效。 我们有一个执行连接的IDisposabel类连接。 这是一种近距离的方法:

public void close()
{
    SqlConnection.ClearAllPools();
    //.ClearPool(BdTransCx);
    // SqlConnection.ClearPool(BdArchCx);

    if (ConectarArchivos) 
    {
        if (BdArchCx.State == ConnectionState.Open)
        {
            BdArchCx.Close();
        }
    }
    if (BdArchCx.State == ConnectionState.Open)
    {
        BdTransCx.Close();
    }
}

在每个请求之后调用此方法。

3 个答案:

答案 0 :(得分:2)

You should wrap your SqlConnection objects, and any SqlCommand objects in a using block

using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        cm.ExecuteNonQuery();
    }
} 

有关详细信息,请参阅"Your Friend the C# Using Statement."

答案 1 :(得分:2)

.NET中的连接是合并的,因此看到一些在数据库中仍处于活动状态的连接是正常的。

你不应该试图杀死连接池,这只会破坏性能。存在池的原因是,重用连接的速度很多比每次建立新连接更快。

只需确保正确关闭每个连接和每个命令,以便将它们返回到池中。您可以使用using块来确保无论发生什么情况都能正确处理它们:

using (SqlConnection connenction = ...) {
  using (SqlCommand command = ...) {
    ...
  }
}

答案 2 :(得分:1)

  

确保将Reader同时保留在using语句中以避免连接问题

using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        using (IDataReader dr = cm.ExecuteReader())
        {
        }
    }
}