sqlserver連接池及查看連接數相關
asp.net 連接池
數據庫鏈接是一種危險的、昂貴的、有限的資源,特別是在多層Web應用程序中。你必須正確管理你的鏈接,因為你的方法將極大的影響應用程序的整體升級性。高性能應用程序與使用中的數據源保持最短時間的連接,並且利用性能增強技術,例如連接池。連接池用於ODBC 的 SQL Server、OLE DB 和 .NET 框架數據提供程序隱式緩沖連接。通過在連接字符串中指定不同的屬性值,可以控制連接池的行為。連接池概述
數據庫鏈接池使應用程序能夠重用池中的現有鏈接,而不是重復地建立對數據庫的鏈接。這種技術將極大地增加應用程序的可擴展性,因為有限的數據庫鏈接可以為很多的客戶提供服務。此技術也將提高性能,因為能夠避免用於建立新鏈接的巨大時間。
具體來說,大多數 ADO.NET 數據提供程序使用連接池,以提高圍繞 Microsoft 斷開連接的 .NET 結構構建的應用程序的性能。應用程序首先打開一個連接(或從連接池獲得一個連接句柄),接着運行一個或多個查詢,然后處理行集,最后將連接釋放回連接池。如果沒有連接池,這些應用程序將花費許多額外時間來打開和關閉連接。
下面將以SQL Server .NET Framework 數據提供程序連接池為例來說明連接池的一些性能和用法。(另外還有ODBC .NET Framework 數據提供程序連接池、OLE DB .NET Framework 數據提供程序連接池。)
池的創建和分配
當連接打開時,將根據一種精確的匹配算法來創建連接池,該算法會使連接池與連接中的字符串相關聯。每個連接池都與一個不同的連接字符串相關聯。當新連接打開時,如果連接字符串不精確匹配現有池,則將創建一個新池。
在以下示例中,將創建三個新的 SqlConnection 對象,但只需要使用兩個連接池來管理這些對象。請注意,第一個和第二個連接字符串的差異在於為 Initial Catalog 分配的值。
SqlConnection conn =
new SqlConnection();
conn.ConnectionString =
"Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// Pool A is created.
SqlConnection conn =
new SqlConnection();
conn.ConnectionString =
"Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();
// Pool B is created because the connection strings differ.
SqlConnection conn =
new SqlConnection();
conn.ConnectionString =
"Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// The connection string matches pool A.
連接池一旦創建,直到活動進程終止時才會被毀壞。非活動或空池的維護只需要最少的系統開銷。
在使用SQL Server .NET數據供應器鏈接池時,必須清楚:
鏈接是通過對鏈接字符串精確匹配的法則被池化的。池化機制對名稱-值對間的空格敏感。例如,下面的兩個鏈接字符串將生成單獨的池,因為第二個字符串包含了一個額外的空字符。
SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Database=Northwind");
conn.Open(); // Pool A is created
SqlConmection conn = new SqlConnection("Integrated Security=SSPI ; Database=Northwind");
conn.Open(); // Pool B is created (extra spaces in string)
連接的添加
連接池是為每個唯一的連接字符串創建的。當創建一個池后,將創建多個連接對象並將其添加到該池中,以滿足最小池大小的要求。連接將根據需要添加到池中,直至達到最大池大小。
當請求 SqlConnection 對象時,如果存在可用的連接,則將從池中獲取該對象。若要成為可用連接,該連接當前必須未被使用,具有匹配的事務上下文或者不與任何事務上下文相關聯,並且具有與服務器的有效鏈接。
如果已達到最大池大小且不存在可用的連接,則該請求將會排隊。當連接被釋放回池中時,連接池管理程序通過重新分配連接來滿足這些請求。對 Connection 調用 Close 或 Dispose 時,連接被釋放回池中。
連接的移除
如果連接生存期已過期,或者連接池管理程序檢測到與服務器的連接已斷開,連接池管理程序將從池中移除該連接。請注意,只有在嘗試與服務器進行通信后,才可以檢測到這種情況。如果發現某連接不再連接到服務器,則會將其標記為無效。連接池管理程序會定期掃描連接池,查找已釋放到池中並標記為無效的對象。找到后,這些連接將被永久移除。
如果存在與已消失的服務器的連接,那么即使連接池管理程序未檢測到已斷開的連接並將其標記為無效,仍有可能將此連接從池中取出。當發生這種情況時,將生成異常。但是,為了將該連接釋放回池中,仍必須將其關閉。
選擇池容量
能建立最大極限對於管理幾千用戶同時發出請求的大型系統來說是非常重要的。你需要監視鏈接池及應用程序的性能,以確定系統的最優池容量。最優容量還要依賴於運行SQL Server的硬件。
在開發期間,也許需要減小默認的最大池容量(目前是100)以幫助查找鏈接泄漏。
如果設立了最小池容量,那么當池最初被填充以達到該值時,會導致一些性能損失,盡管最初鏈接的幾個客戶會從中受益。注意,創建新鏈接的過程被序列化了,這就意味着當池最初被填充時,服務器無法處理同時發生的請求。
監視鏈接池化
要監視應用程序對鏈接池化的應用情況,可以使用隨SQL Server發行的Profiler工具,或隨微軟Windows 2000發行的性能監視器。
要利用SQL Server Profiler 監視鏈接池化,操作如下:
1. 單擊開始,指向程序,指向Microsoft SQL Server,然后單擊Profiler運行Profiler。
2. 在文件菜單中,指向新建,然后單擊跟蹤。
3. 提供鏈接內容,然后單擊確定。
4. 在跟蹤屬性對話框中,單擊事件標簽。
5. 在已選事件類別列表中,確保審核登錄和審核登出事件顯示在安全審核下面。
6. 單擊運行開始跟蹤。在鏈接建立時,將會看到審核登錄事件;在鏈接關閉時看到審核登出事件。
要通過性能監視器監視鏈接池化,操作如下:
1. 單擊開始,指向程序,指向管理工具,然后單擊性能運行性能監視器。
2. 在圖表背景中右擊,然后單擊增加計數器。
3. 在性能對象下拉列表框中,單擊SQL Server:通用統計。
4. 在出現的列表中,單擊用戶鏈接。
5. 單擊增加,然后單擊關閉。
在config中加pooling=false,說明程序中不用連接池。
現在,問題解決,在config文件的連接字符串中增加max pool size ="1000" 擴大連接池,同時,調整程序,盡量避免多開連接。
查看連接數相關
1、獲取SQL Server允許同時用戶連接的最大數
SELECT @@MAX_CONNECTIONS2、獲取當前指定數據庫的連接信息
SELECT *
FROM master.dbo.sysprocesses
WHERE dbid
IN
SELECT dbid
FROM master.dbo.sysdatabases
WHERE
NAME=
'YourDataBaseName'
--根據需要更改YourDataBaseName
SELECT *
FROM master.dbo.sysprocesses
WHERE DB_NAME(dbid) =
'YourDataBaseName'
3、獲取當前SQL服務器所有的連接詳細信息
SELECT * FROM sysprocesses
以上查詢結果包含了:系統進程和用戶進程。
如果只是想查用戶進程的話則需采用下面的方法
4、獲取自上次啟動 SQL Server服務 以來連接或試圖連接的次數
SELECT @@CONNECTIONS
5 ---查看當前數據庫系統所有請求情況.
只列出了我認為比較重要有助於我解決問題的字段。
SELECT ds.session_id,
ds.status,
Db_name(dr.database_id)
AS database_name,
ds.login_name,
ds.login_time,
ds.host_name,
dc.client_net_address,
dc.client_tcp_port,
ds.program_name,
dr.cpu_time,
dr.reads,
dr.writes,
dc.num_reads,
dc.num_writes,
ds.client_interface_name,
ds.last_request_start_time,
ds.last_request_end_time,
dc.connect_time,
dc.net_transport,
dc.net_packet_size,
dr.start_time,
dr.status,
dr.command,
dr.blocking_session_id,
dr.wait_type,
dr.wait_time,
dr.last_wait_type,
dr.wait_resource,
dr.open_transaction_count,
dr.percent_complete,
dr.granted_query_memory
FROM Sys.dm_exec_requests dr
WITH(nolock)
RIGHT
OUTER
JOIN Sys.dm_exec_sessions ds
WITH(nolock)
ON dr.session_id = ds.session_id
RIGHT
OUTER
JOIN Sys.dm_exec_connections dc
WITH(nolock)
ON ds.session_id = dc.session_id
WHERE ds.session_id >
50
ORDER
BY ds.program_name
6 用戶連接數
SELECT login_name,
Count(
0) user_count
FROM Sys.dm_exec_requests dr
WITH(nolock)
RIGHT
OUTER
JOIN Sys.dm_exec_sessions ds
WITH(nolock)
ON dr.session_id = ds.session_id
RIGHT
OUTER
JOIN Sys.dm_exec_connections dc
WITH(nolock)
ON ds.session_id = dc.session_id
WHERE ds.session_id >
50
GROUP
BY login_name
ORDER
BY user_count
DESC