关闭 SQL 连接但打开的连接不断增加

tho*_*vdb 5 c# sql-server asp.net 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; }
Run Code Online (Sandbox Code Playgroud)

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

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

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

jam*_*ams 5

此链接很好地解释了连接池。如果你想了解整件事,你应该阅读这本书,它非常好。

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