关闭SQL连接但打开的连接会继续递增

时间:2011-05-18 10:15:22

标签: c# asp.net sql-server ado.net

我有以下方法:

public DataSet GetDataSet( string sp, params SqlParameter[] parameters ) {
DataSet ds = new DataSet();

using ( SqlConnection conn = new SqlConnection(
        ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString
    ) ) {
    using ( SqlCommand cmd = new SqlCommand() ) {
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = sp;

        if ( parameters != null ) {
            foreach ( SqlParameter parm in parameters ) {
                cmd.Parameters.Add( parm );
            }
        }

        if ( conn.State == ConnectionState.Closed ) {
            conn.Open();
        }

        using ( SqlDataAdapter da = new SqlDataAdapter( cmd ) ) {
            da.Fill( ds );
        }
    }
}

return ds; }

我注意到多次调用此方法时会创建多个连接(大约50次)。 我通过在SQL中执行此查询来检查这一点:

SELECT DB_NAME(dbid) as 'DbNAme', COUNT(dbid) as 'Connections' from master.dbo.sysprocesses with (nolock) WHERE dbid > 0 GROUP BY dbid

调用上述方法时,连接数会不断增加。它不应该一遍又一遍地使用相同的连接(连接池)而不是创建新的连接吗?

4 个答案:

答案 0 :(得分:4)

尝试在web.config中的连接字符串中增加最大池大小,如此

<add name="ConString" connectionString="SERVER=localhost;DATABASE=databasename;UID=username;PWD=password;Pooling=true;Max Pool Size=100;"/>

或者你定义它的任何地方。它解决了问题,但暂时解决了你的代码永久解决方案你可能没有关闭连接

希望它会帮助你

答案 1 :(得分:4)

这个link很好地解释了连接池。如果你想了解整个事情,你应该阅读这篇文章非常好。

  

连接池减少了数量   新连接必须是的时代   打开。合伙人保持所有权   物理连接。它管理   通过保持一组的连接来建立联系   每个给定的活动连接   连接配置。每当一个   用户调用在连接上打开,   pooler寻找可用的   池中的连接。如果汇集了   连接可用,它返回它   调用者而不是打开新的   连接。当应用程序调用时   关闭连接,pooler   将其返回到合并的活动集   连接而不是关闭它。   一旦连接返回到   游泳池,它准备重新使用   下一次公开电话。

答案 2 :(得分:3)

连接池并不意味着它将重用连接。由于建立SQL连接的成本很高,因此连接池保持固定的最大连接数,并且当您在连接上调用.Close()时,它只会返回到池,然后池可以将其传递给新连接在新实例上调用Open()时。

这个机制内置在SqlConnection类中,这就是它对用户透明的原因;简而言之:只要正确using连接(就像你一样),你就不必担心打开连接的数量。

答案 3 :(得分:0)

填写数据集后尝试关闭连接。使用语句释放对象,但它不会关闭连接。