如果要查看IIS串連數,最簡單方便的方法是通過“網站統計”來查看,“網站統計”的當前線上人數可以認為是當前IIS串連數。然而,“網站統計”的當前線上人數統計時間較長,一般為10分鐘或15分鐘,再加上統計技術及統計機制的問題,從而會產生或多或少的統計誤差。
如果要想知道確切的當前網站IIS串連數的話,最有效方法是通過windows內建的系統監視器來查看。這正是本文要介紹的方法。 一、 建立IIS並發串連數監控器
1. 運行-->輸入“perfmon.msc”
2. 在“系統監視器”圖表區域裡點擊右鍵,然後點“添加計數器”
圖一
3. 在“添加計數器”視窗,“效能物件”選擇Web Service,“從列表選擇計數器”選中Current Connection,“從列表選擇執行個體”選中你要統計的網站,最後點擊“添加”按鈕
圖二 二、 設定完畢
這樣,你就可以在“系統監視器”圖表區域中看到一條曲線(此曲線你可以設定其顏色和寬度等參數),它就是網站的IIS串連數曲線圖了,如圖一黃色曲線所示。
需要說明的是,windows系統監視器顯示的是即時IIS並發串連數,並非如“網站統計”那裡的15分鐘內訪問人數,所以你會發現IIS並發串連數並不會太多
解決方案:
逾時時間已到。逾時時間已到,但是尚未從池中擷取串連。出現這種情況可能是因為所有池串連均在使用,並且達到了最大池大小。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。
異常詳細資料: System.InvalidOperationException: 逾時時間已到。逾時時間已到,但是尚未從池中擷取串連。出現這種情況可能是因為所有池串連均在使用,並且達到了最大池大小。
這是個老問題了。你就查兩點:
一、看所有open的串連是否都close了。
二、如果訪問量很大,加上Max Pool Size=512這一句,當然這是要以損失系統效能為代價的。
這樣以後一定可以解決你的問題。
解決方案一
我 想原因可能是並行作業。DataReader是獨佔串連的,就是說你的程式可能設計上有問題。比如說最大串連設100,假設有100個人同時使用 DataReader正在讀取資料庫內容,那麼當第101人讀取的時候,串連池中的串連已經沒有了,就會出現上面的錯誤。DataReader是獨佔串連 的,每個DataReader都要佔用一個串連。當然這個情況是偶爾出現的,所以會很長時間出現一次,因為只有同時有超過串連池最大串連數量的並行作業才 會發生。而且你加大並發數量只能暫時緩解問題,如果你加大到200個並發串連,如果有201 人同時操作怎麼辦。你說了你使用Connection對象的Close()方法,這是不行的,因為Close()方法僅僅是關閉串連,但這個串連沒有釋 放,還是被這個對象佔用,要釋放必須使用Connection的Dispose()方法顯式釋放串連才可以,否則這個對象佔用的串連只能等到垃圾收集的情 況下才能被釋放。這種情況肯定會出現“逾時時間已到”的錯誤。
解決方案:
1 修改幾個關鍵頁面或訪問比較頻繁的資料庫訪問操作,使用DataAdapter和DataSet來擷取資料庫資料,不要使用DataReader。
2 在訪問資料庫的頁面上使用資料緩衝,如果頁面的資料不是經常更新(幾分鐘更新一次)的話,使用Cache對象可以不用訪問資料庫而使用緩衝中的內容,那麼可以大大減少串連數量。
3 修改代碼,把使用Connection對象的地方都在Close()後面加上Dispose()調用。
4 建議對資料庫操作進行大的修改,建立自己的資料庫操作代理類,繼承System.IDisposable介面,強迫釋放資源,這樣就不會出現串連數量不夠的問題了。
解決方案二
解決方案(*):WEB.config 裡面:在資料庫連接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一勞永逸。
解決方案三
估計是串連(Connection)對象沒有Close。倒是不必Dispose,而DataReader用完後應該關閉,但不關閉也沒問題,只是不關閉的話此連線物件就一直不能用,只要你最終關閉了連線物件就不會出問題。
連線物件在Open後的操作都放在try塊中,後面跟一個finally塊:conn.Close();
如何查詢sql2005串連數
經常發生 “資料庫連接過多的錯誤” 這樣的錯誤,但是卻又不清楚當前的串連數為多少,大致的總結了幾種方法。
1.通過系統的“效能”來查看:
開始->管理工具->效能(或者是運行裡面輸入 mmc)然後通過
[attach]52716[/attach]
添加計數器添加 SQL 的常用統計 然後在下面列出的項目裡面選擇使用者串連就可以時時查詢到資料庫的串連數了。
不過此方法的話需要有訪問那台電腦的許可權,就是要通過windows賬戶登陸進去才可以添加此計數器。
2.通過系統資料表來查詢:
[code]SELECT * FROM
[Master].[dbo].[SYSPROCESSES] WHERE [DBID]
IN
(
SELECT
[DBID]
FROM
[Master].[dbo].[SYSDATABASES]
WHERE
NAME='databaseName'
)
[/code]
databaseName 是需要查看的資料庫,然後查詢出來的行數,就是當前的串連數。不過裡面還有一些別的狀態可以做參考用。
由上面的語句可以看出系統資料表擷取一些串連和活動資訊,主要介紹下面的兩個系統資料表:
(1)sprocesses
sysprocesses 表中儲存關於運行在 Microsoft® SQL Server 上的進程的資訊。這些進程可以是用戶端進程或系統進程。sysprocesses 只儲存在 master 資料庫中。
(2)Sysperfinfo
包括一個 Microsoft® SQL Server 標記法的內部效能計數器,可通過 Windows NT 效能監控器顯示.
有人提議說為了擷取SQL Server的當前串連數:使用如下SQL:
SELECT COUNT(*) AS CONNECTIONS FROM master..sysprocesses
個人認為這樣不對,看看.sysprocesses的login_time列就可看出.
另外一個方面是進程不能和串連相提並論,他們是一對一的關係嗎,也就是說一個進程就是一個串連?一個串連應該有多個進程的,所以串連和進程之間的關係應該是1:n的.
因為sysprocesses列出的進程包含了系統進程和使用者進程,為了得到使用者串連,可以使用如下SQL:
SELECT cntr_value AS User_Connections FROM master..sysperfinfo as p
WHERE p.object_name = 'SQLServer:General Statistics' And p.counter_name = 'User Connections'
個人還是認為不對,因為它是一個計數器,可能會累加的.
還有一種方案是利用如下SQL:
select connectnum=count(distinct net_address)-1 from master..sysprocesses
理由是net_address是訪問者機器的網卡值,這個總該是唯一的吧.但是看起來得到的是所有時間內的串連數.
希望大家可以給出自己的解決方案.這個問題解決了,相信會有很大的用途.
3.通過系統過程來查詢:
[url=http://search.microsoft.com/default.asp?so=RECCNT&siteid=us%2Fdev&p=1&nq=NEW&qu=SP_WHO&IntlSearch=&boolean=PHRASE&ig=01&i=09&i=99]SP_WHO[/url] 'loginName'
loginName 是當然登陸Sql的使用者名稱,一般程式裡面都會使用一個username來登陸SQL這樣通過這個使用者名稱就能查看到此使用者名稱登陸之後佔用的串連了。
如果不寫loginName,那麼返回的就是所有的串連。
sp_who提供icrosoft® SQL Server 使用者和進程的資訊。可以篩選返回的資訊,以便只返回那些不是閒置進程。
列出所有活動的使用者:SP_WHO ‘active’
列出某個特定使用者的資訊:SP_WHO ‘sa’
4、系統變數
@@CONNECTIONS 返回自上次啟動 Microsoft® SQL Server 以來串連或試圖串連的次數。
@@MAX_CONNECTIONS 返回 Microsoft® SQL Server 上允許的同時使用者串連的最大數。返回的數不必為當前配置的數值
***************串連池和串連數詳解**********
串連到資料庫伺服器通常由幾個需要很長時間的步驟組成。 必須建立物理通道(例如通訊端或具名管道),必須與伺服器進行初次握手,必須分析連接字串資訊,必須由伺服器對串連進行身分識別驗證,必須運行檢查以便在當前事務中登記,等等。
實際上,大多數應用程式僅使用一個或幾個不同的串連配置。 這意味著在執行應用程式期間,許多相同的串連將反覆地開啟和關閉。 為了使開啟的串連成本最低,ADO.NET 使用稱為串連池的最佳化方法。
串連池減少新串連需要開啟的次數。 池進程保持物理串連的所有權。 通過為每個給定的串連配置保留一組活動串連來管理串連。 只要使用者在串連上調用 Open,池進程就會檢查池中是否有可用的串連。 如果某個池串連可用,會將該串連返回給調用者,而不是開啟新串連。 應用程式對該串連調用 Close 時,池進程會將串連返回到活動串連池集中,而不是真正關閉串連。 串連返回到池中之後,即可在下一個 Open 調用中重複使用。
只有配置相同的串連可以建立池串連。 ADO.NET 同時保留多個池,每個配置一個池。 串連由連接字串以及 Windows 標識(在使用整合的安全性時)分為多個池。 還根據串連是否已在事務中登記來建立池串連。
池串連可以顯著提高應用程式的效能和可縮放性。 預設情況下,ADO.NET 中啟用串連池。除非顯式禁用,否則,串連在應用程式中開啟和關閉時,池進程將對串連進行最佳化。 還可以提供幾個連接字串修飾符來控制串連池的行為。 有關更多資訊,請參見本主題後面的“使用連接字串關鍵字控制串連池”。
池的建立和分配
在初次開啟串連時,將根據完全符合演算法建立串連池,該演算法將池與串連中的連接字串關聯。 每個串連池都與一個不同的連接字串相關聯。 開啟新串連時,如果連接字串並非與現有池完全符合,將建立一個新池。 按進程、按應用程式定義域、按連接字串以及(在使用整合的安全性時)按 Windows 標識來建立池串連。 連接字串還必須是完全符合的;按不同順序為同一串連提供的關鍵字將分到單獨的池中。
在以下 C# 樣本中建立了三個新的 SqlConnection 對象,但是管理時只需要兩個串連池。 注意,根據為 Initial Catalog 分配的值,第一個和第二個連接字串有所不同。
複製代碼
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// Pool A is created.
}
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=pubs"))
{
connection.Open();
// Pool B is created because the connection strings differ.
}
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// The connection string matches pool A.
}
如果 MinPoolSize 在連接字串中未指定或指定為零,池中的串連將在一段時間不活動後關閉。 但是,如果指定的 MinPoolSize 大於零,在 AppDomain 被卸載並且進程結束之前,串連池不會被破壞。 非活動或空池的維護只需要最少的系統開銷。
注意:
當出現容錯移轉等錯誤時,會自動清除池。
添加串連
串連池是為每個唯一的連接字串建立的。 當建立一個池後,將建立多個連線物件並將其添加到該池中,以滿足最小池大小的要求。 串連根據需要添加到池中,但是不能超過指定的最大池大小(預設值為 100)。 串連在關閉或斷開時釋放回池中。
在請求 SqlConnection 對象時,如果存在可用的串連,將從池中擷取該對象。 串連要可用,必須未使用,具有匹配的事務上下文或未與任何事務上下文關聯,並且具有與伺服器的有效連結。
串連池進程通過在串連釋放回池中時重新分配串連,來滿足這些串連請求。 如果已達到最大池大小且不存在可用的串連,則該請求將會排隊。 然後,池進程嘗試重建立立任何串連,直到到達逾時時間(預設值為 15 秒)。 如果池進程在連線逾時之前無法滿足請求,將引發異常。
警告:
我們強烈建議您在使用完串連後總是將其關閉,以使串連返回到池中。要關閉串連,可以使用 Connection 對象的 Close 或 Dispose 方法,也可以通過在 C# 的 using 語句中或在 Visual Basic 的 Using 語句中開啟所有串連。 不是顯式關閉的串連可能不會添加或返回到池中。 有關更多資訊,請參見 Visual Basic 的using Statement (C# Programmer's Reference)或How to: Dispose of a System Resource。
注意:
不要在類的 Finalize 方法中對 Connection、DataReader 或任何其他託管對象調用 Close 或 Dispose。 在終結器中,僅釋放類直接擁有的非託管資源。 如果類不擁有任何非託管資源,則不要在類定義中包含 Finalize 方法。 有關更多資訊,請參見Garbage Collection。
移除串連
如果串連長時間空閑,或池進程檢測到與伺服器的串連已斷開,串連池進程會將該串連從池中移除。 注意,只有在嘗試與伺服器進行通訊之後才能檢測到斷開的串連。 如果發現某串連不再串連到伺服器,則會將其標記為無效。 無效串連只有在關閉或重建立立後,才會從串連池中移除。
如果存在與已消失的伺服器的串連,那麼即使串連池管理程式未檢測到已斷開的串連並將其標記為無效,仍有可能將此串連從池中取出。 這種情況是因為檢查串連是否仍有效系統開銷將造成與伺服器的另一次往返,從而抵消了池進程的優勢。 發生此情況時,初次嘗試使用該串連將檢測串連是否曾斷開,並引發異常。
清除池
ADO.NET 2.0 引入了清除池的兩種新方法: ClearAllPools 和 ClearPool。 ClearAllPools 清除給定提供者的串連池,ClearPool 清除與特定串連關聯的串連池。 如果在調用時串連正在使用,將進行相應的標記。 串連關閉時,將被丟棄,而不是返回池中。
事務支援
串連是根據事務上下文來從池中取出並進行分配的。 除非在連接字串中指定了 Enlist=false,否則,串連池將確保串連在 Current 上下文中登記。 當串連通過登記的 System.Transactions 事務關閉並返回到池中時,串連將被保留,以便下次使用同一 System.Transactions 事務請求該串連池時,可返回同一串連(如果該串連可用)。如果該串連不可用,則會開啟新串連。如果該事務沒有可用串連,在該串連開啟時,將自動註冊該串連。
當串連關閉時,它將被釋放回池中,並根據其事務上下文放入相應的子部分。 因此,即使分散式交易仍然掛起,仍可以關閉該串連而不會建置錯誤。 這樣,您就可以在隨後提交或中止分散式交易。
使用連接字串關鍵字控制串連池
SqlConnection 對象的 ConnectionString 屬性支援連接字串鍵/值對,可以用於調整串連池邏輯的行為。 有關更多資訊,請參見 ConnectionString。
池片段
池片段是許多 Web 應用程式中的一個常見問題,應用程式可能會建立大量在進程退出後才會釋放的池。 這樣,將開啟大量的串連,佔用許多記憶體,從而影響效能。
因為整合式安全性產生的池片段
串連根據連接字串以及使用者標識來建立池串連。 因此,如果使用網站上的基本驗證或 Windows 身分識別驗證以及整合的安全登入,每個使用者將獲得一個池。 儘管這樣可以提高單個使用者的後續資料庫請求的效能,但是該使用者無法利用其他使用者建立的串連。 這樣還使每個使用者至少產生一個與資料庫伺服器的串連。 這對特定 Web 應用程式結構會產生副作用,因為開發人員需要衡量安全性和審計要求。
因為許多資料庫產生的池片段
許多 網際網路服務提供者在一台伺服器上託管多個網站。 他們可能使用單個資料庫確認表單身分識別驗證登入,然後為該使用者或使用者組開啟與特定資料庫的串連。 與驗證資料庫的串連將建立池串連,供每個使用者使用。 但是,每個資料庫的串連存在一個獨立的池,因此增加了與伺服器的串連數。
這也會對應用程式設計產生副作用。 但是,可以通過一個相對簡單的方式避免此副作用,而又不會影響串連 SQL Server 時的安全性。 不是為每個使用者或組串連獨立的資料庫,而是串連到伺服器上的相同資料庫,然後執行 Transact-SQL USE 語句來切換為所需的資料庫。 以下程式碼片段示範入如何建立與 master 資料庫的初始串連,然後切換到 databaseName 字串變數中指定的所需資料庫。
Visual Basic 複製代碼
' Assumes that command is a valid SqlCommand object and that
' connectionString connects to master.
command.Text = "USE DatabaseName"
Using connection As New SqlConnection(connectionString)
connection.Open()
command.ExecuteNonQuery()
End Using
C# 複製代碼
// Assumes that command is a SqlCommand object and that
// connectionString connects to master.
command.Text = "USE DatabaseName";
using (SqlConnection connection = new SqlConnection(
connectionString))
{
connection.Open();
command.ExecuteNonQuery();
}
應用程式角色和串連池
通過調用 sp_setapprole 系統預存程序啟用了 SQL Server 應用程式角色之後,該串連的安全上下文無法重設。 但是,如果啟用了池,串連將返回池,在重複使用池串連時會出錯。 有關更多資訊,請參見知識庫文章“SQL application role errors with OLE DB resource pooling”(OLE DB 資源集區出現 SQL 應用程式角色錯誤)。
應用程式角色替代項
如果您使用的是 SQL Server 2005,我們建議您利用可代替應用程式角色的新安全機制。 有關更多資訊,請參見在 SQL Server 中建立應用程式角色 (ADO.NET)。