2012-08-09 41 views
6

我的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

回答

1

你可能想在連接池念起來: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

8

這說明每各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

2

SQL查詢來獲得當前活動連接

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

您可以定義DBID如果你想具體到數據庫

相關問題