C# 正在关闭与SQL Server DB的连接和连接数

C# 正在关闭与SQL Server DB的连接和连接数,c#,C#,我有一个ASP.net应用程序,我在其中对SQL Server数据库进行查询。查询结束后,我将执行以下操作: reader.Close(); reader.Dispose(); conn.Close(); conn.Dispose(); 当我使用SQL Server并执行以下操作时: SELECT DB_NAME(dbid) as DBName, COUNT(dbid) as NoOfConnections, loginame as LoginName FROM

我有一个ASP.net应用程序,我在其中对SQL Server数据库进行查询。查询结束后,我将执行以下操作:

reader.Close();
reader.Dispose();
conn.Close();
conn.Dispose();
当我使用SQL Server并执行以下操作时:

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NoOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame

我可以看到“NoOfConnections”在我关闭连接时不断增加,有一刻我会出错,因为我打开了100多个连接如何正确关闭连接

SQL Server连接池将缓存连接。您可以使用以下方法清除所有连接池:

conn.ClearAllPools();
有关详细信息,请参阅

要清除特定连接的连接池,可以使用ClearPool方法。例如:

conn.ClearPool();
Provider=SQLOLEDB;Data Source=ServerName;Integrated Security=SSPI;Min Pool Size=5; Max Pool Size=20;
Provider=SQLOLEDB;Data Source=ServerName;Integrated Security=SSPI;Pooling=false;
有关详细信息,请参阅

您可以通过连接字符串配置连接池的大小,例如:

conn.ClearPool();
Provider=SQLOLEDB;Data Source=ServerName;Integrated Security=SSPI;Min Pool Size=5; Max Pool Size=20;
Provider=SQLOLEDB;Data Source=ServerName;Integrated Security=SSPI;Pooling=false;
您还可以在连接字符串中关闭池,例如:

conn.ClearPool();
Provider=SQLOLEDB;Data Source=ServerName;Integrated Security=SSPI;Min Pool Size=5; Max Pool Size=20;
Provider=SQLOLEDB;Data Source=ServerName;Integrated Security=SSPI;Pooling=false;
默认情况下,连接池处于启用状态,连接池的默认大小为100。如果客户端连接字符串相同,则池将尝试使用连接池中的连接(如果可用)。有关更多信息,请参阅

而不是这样做

reader.Close();
reader.Dispose();
conn.Close();
conn.Dispose();
为什么不使用using语句呢?例如,对于连接:

using (var conn = new SqlConnection("YourConnectionString"))
{
    //your code here
}

这将为您关闭并处置SqlConnection对象。

使用
using
-语句处置非托管资源。如果您处理/关闭连接,则不会关闭物理连接。那要看情况而定。启用连接池时关闭连接(默认设置)只意味着现在可以自由使用此连接。我使用IDbConnection,因此无法使用这些方法,如果我将IDbConnection强制转换为SqlConnection,然后调用方法“ClearPool”,它能工作吗?如果您使用的是SQL Server,您可能应该始终使用SqlConnection。从IDbConnection转换为Sql Connection是不安全的,请看这里,所以我最终更改了所有处理方法以使用您的解决方案,并且效果更好。