繁体   English   中英

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

[英]Closing SQL-connection but open connections keeps incrementing

我有以下方法:

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

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

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

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

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

希望它会对你有所帮助

链接很好地解释了连接池。 如果你想了解整个事情,你应该阅读这个,这是非常好的。

连接池减少了必须打开新连接的次数。 pooler保持物理连接的所有权。 它通过为每个给定的连接配置保持一组活动连接来管理连接。 每当用户在连接上调用Open时,pooler将在池中查找可用连接。 如果池连接可用,则将其返回给调用者,而不是打开新连接。 当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是关闭它。 一旦连接返回到池,就可以在下一个Open调用中重用它。

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

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

填充数据集后尝试关闭连接。 使用statment release对象但它没有关闭连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM