Sql-Server

使用ADO.NET Sql server 睡眠狀態增加?

  • August 25, 2019

我們有一個由大約 1000 個並髮使用者使用的實時 ASP.Net 應用程序。在這個應用程序中,我們使用了連接池。在 web.config 中定義了 2 個名稱不同的連接字元串,但我們呼叫的是同一個數據庫。

<add key="connection1" value="server=1.1.1.1;USER ID=**;pwd=**;database=test;Max Pool Size=500;Min Pool Size=50;Connection Timeout = 300; Pooling='true'" />

<add key="connection2" value="server=1.1.1.1;USER ID=**;pwd=**;database=test;Max Pool Size=500;Min Pool Size=50;Connection Timeout = 300; Pooling='true'"/>

在我的應用程序中,我們正在打開一個關閉連接,如下所示

try{
   if (connection.State == ConnectionState.Closed)
       {
           connection.Open();
       }
}
catch(Exception ex)
{
}
finally{connection.close()}

現在的問題是當我使用 sp_who2 檢查數據庫時,我看到大約 1000 個或更多的睡眠會話,並且每個記錄程序名稱都是“.Net sql server Provider”。我瀏覽了 MSDN,發現如果我們使用連接池,那麼連接會一直打開到 4-8 分鐘。所以我現在有點困惑,如果我只使用 2 個連接字元串和連接池,那麼為什麼我們會看到這麼多睡眠連接,我認為它應該只有 2 個?有人可以在這種情況下幫助我並提出正確的建議嗎?以及我們如何才能最大限度地減少睡眠時間。也不確定是應用程序池(IIS 伺服器)錯誤還是應用程序錯誤?請幫忙。

謝謝,

所以我現在有點困惑,如果我只使用 2 個連接字元串和連接池,那麼為什麼我們會看到這麼多睡眠連接,我認為它應該只有 2 個?

Min Pool Size=50指定創建池時建立的連接數,並將保留在池中,直到解除安裝應用程序池(包括 IIS 重新啟動)。使用 2 個不同的連接字元串和安全上下文,您將始終擁有至少 100 個連接,並且這些連接在不使用時將顯示為在 SQL Server 上休眠。的目的Min Pool是確保至少有一定數量的連接始終可供應用程序使用,並避免物理關閉和打開連接所需的成本,但代價如下所述。

Max Pool Size=500規範允許每個池最多 500 個連接,因此如果需要,您可以擁有最多 1000 個連接。Min Pool Size僅當池中沒有未使用的連接時,才會獲取超出的連接。您看到的大量連接sp_who2可能是由於使用者活動、長時間執行的查詢,因為連接沒有及時關閉/處置,或者池連接仍然與事務上下文相關聯。

以及我們如何才能最大限度地減少睡眠時間。也不確定是應用程序池(IIS 伺服器)錯誤還是應用程序錯誤?請幫忙。

不知道您所說的 IIS 錯誤是什麼意思,但不是由於查詢活動而導致的大量休眠連接可能表明存在應用程序問題。ADO.NET 連接池文件中的所有範例都使用一個using塊來確保正確關閉和處理連接,而無需應用程式碼顯式關閉連接。我建議您在使用連接和事務對象的整個應用程序中始終遵循這種做法。

SQL 伺服器上的休眠連接成本是額外的記憶體和客戶端連接池管理。下面的查詢將顯示所有 SQL Server 連接消耗了多少記憶體:

SELECT SUM(cntr_value) AS ConnectionMemoryKB
FROM sys.dm_os_performance_counters
WHERE counter_name = N'Connection Memory (KB)';

ADO.NET連接池文件

引用自:https://dba.stackexchange.com/questions/246165