2012-03-22 129 views
-1

我正在将Foxpro迁移到ASP.NET MVC应用程序。的逻辑的连接太多Asp.net

近70%被嵌入在SqlServer的存储过程。出于这个原因,我们正在使用一些过程来更新某些表(我们不映射SP,只需使用SqlConnection和SqlDataReader,SqlCommand,SqlAddapter调用它们)。

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

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

可以找到一个活动的连接并重用它?

最后的尝试是:

SqlConnection.ClearAllpools(); 

不过,这并不立即生效。 我们有一个执行连接的IDisposabel类连接。 这是de close方法:

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(); 
    } 
} 

在每次请求后调用此方法。

+1

关闭一旦你完成它的连接。看看[using-statement](http://msdn.microsoft.com/en-us/library/yh598w02.aspx)。连接池假定当你没有关闭连接时不能重用连接。请记住,关闭只是池的标志,实际上与数据库的连接保持打开状态,以便尽快重用。如果池中的每个连接都处于使用状态(打开),池会创建一个新的物理连接,这非常昂贵。它是否达到MaxPoolSize(默认值为100),你会得到你的例外。 – 2012-03-22 15:50:46

+0

很tks。你正在谈论的关闭方法是SqlConnection.close()?或者必须是:using-statement? – 2012-03-22 15:58:22

+0

假设'BdArchCx'是'SqlConnection':'BdArchCx。关闭()'在最后一个try/catch的块类似于'使用(VAR BdArchCx =新的SqlConnection(conString)){}''因为将using'调用'dispose'这隐含关闭连接。尽快处置实现“IDisposable”的每个对象是一种很好的做法。 – 2012-03-22 16:01:43

回答

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(); 
    } 
} 

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

+0

韩国社交协会您的快速解答....这代码表示连接inmediatly配置? – 2012-03-22 15:52:41

+0

是的。 **但是**您必须以相同的方式考虑阅读器处置。 – Pankaj 2012-03-22 16:08:01

2

连接汇集,所以这是正常的看到一些连接仍处于数据库的活动。

你不应该试图杀死连接池,这会杀了性能。有一个池的原因是它的许多重新使用连接比每次建立一个新的连接更快。

只要确保你关闭每个连接,每个命令正确,让他们返回到池中。您可以使用using块,以确保它们被正确配置无论发生什么情况:

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

请务必保持读者,以及在使用声明,以避免连接问题

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

你仍然应该调用cn.Close();这比等待对象被垃圾收集要快。 – NickG 2012-08-23 15:57:33