找到数据库上打开的连接数

问题描述:

我的web应用程序是在asp.net 2.0中,c#2.0和sql服务器208我怎么能找到我的sql server 2008数据库打开连接的数量。有没有什么办法清除连接pool.because,因为我的网站托管在共享主机上,他们提供了有限的连接。在我的编程中,我已经关闭了所有使用后的连接,但仍然得到了暂停数据库的警告。找到数据库上打开的连接数

任何人都可以告诉我如何查找数据库上的开放连接数以及如何清除连接池。

我使用了语句进行连接,并在finally块中使用后关闭所有连接。所以虽然有错误,但会关闭oped连接。

在此先感谢。

+1

什么RDBMS连接? AFAIK,这样做的唯一方法是直接查询数据库服务,并且这对每种风格都有很大的不同。 – 2012-08-09 03:07:19

+0

如果您只是在调试,请尝试'sp_who2' – 2012-08-09 03:20:50

+0

sp_who2提供有关登录用户的详细信息,但是由于其Web应用程序的相同用户可以在数据库上打开更多连接。我想要使​​用我的Web应用程序在数据库上打开连接的数量,它是asp.net。 – 2012-08-09 03:36:33

你可能想在连接池念起来:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

一个独立的连接池是为每个不同的连接字符串创建的。此外,如果您通过集成安全性连接并且您的网站使用基本或Windows身份验证(而不是匿名),则将为该网站的每个用户创建一个单独的连接池。

要清除连接池,SqlConnection对象提供了方法ClearPool()和ClearAllPool()`。但是,单个连接不会关闭并从游泳池中移除,直到它关闭或丢弃。

所有执行IDisposable的sql查询所涉及的各种对象都应该包含在using声明中以保证正确处理。沿着这些路线的东西:

IEnumerable<BusinessObject> list = new List<BusinessObject>() ; 

using (SqlConnection connection = new SqlConnection(credentials)) 
using (SqlCommand  command = connection.CreateCommand()) 
using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
using (DataSet  results = new DataSet()) 
{ 

    command.CommandType = CommandType.StoredProcedure ; 
    command.CommandText = @"someStoredProcedure" ; 

    try 
    { 
    connection.Open() ; 
    adapter.Fill(results) ; 
    connection.Close() ; 

    list = TransformResults(results) ; 

    } 
    catch 
    { 
    command.Cancel() ; 
    throw 
    } 

} 

return list ; 

您可以检查什么的SPID要么由执行存储过程sp_who(必须有在SQL Server在适当的管理员权限)在打开SQL Server。你也可以使用perfmon。

+0

嗨尼古拉斯, 感谢您的答复。 是的,我使用语句进行连接,命令,并关闭和处理终止块连接,我也允许分钟池大小为0和最大池大小为10但仍然有超过200个连接打开数据库和托管人对此抱怨。 你能告诉我如果我使用SqlConnection.ClearAllPool()以及在哪里使用,会发生什么。 – 2012-08-09 04:20:46

这说明每各DB连接数:

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

这使连接总数:

SELECT 
    COUNT(dbid) as TotalConnections 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 

从C#,你可以遵循:
http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx 另一个很好的参考可以发现在:
http://www.wduffy.co.uk/blog/monitoring-database-connections/

呼吁的OleDbConnection静态方法ReleaseObjectPool - 见http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbconnection.releaseobjectpool.aspx

+0

嗨Nitin, 感谢您的回复,但SELECT COUNT(dbid)作为TotalConnections FROM sys.sysprocesses WHERE dbid> 0返回一个,但有25个连接在数据库上打开。 SELECT DB_NAME(DBID)作为数据库名, COUNT(DBID)作为NoOfConnections, loginame的作为LoginName将 FROM sys.sysprocesses WHERE DBID> 0 GROUP BY DBID,loginame的和这也给打开的连接为1 – 2012-08-09 05:39:44

+0

在我的解决方案最后做了编辑,请尝试一下 – 2012-08-09 05:43:48

+1

@RD尝试以SysAdmin身份登录 – Zsmaster 2017-10-03 05:40:12

SQL查询来获得当前活动连接

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

您可以定义DBID如果你想具体到数据库