狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

SQL Server 連接池和最大連接數占用內存和CPU硬件資源分析研究

admin
2025年1月9日 22:11 本文熱度 84

連接到數據源可能需要很長時間。為了最大程度地降低打開連接的成本,ADO.NET 使用一種稱為 連接池的優化技術,這會最大程度地降低重復打開和關閉連接的成本。.NET Framework 數據提供程序處理連接池的方式有所不同。


連接到數據庫服務器通常由幾個需要很長時間的步驟組成。必須建立物理通道(例如套接字或命名管道),必須與服務器進行初次握手,必須分析連接字符串信息,必須由服務器對連接進行身份驗證,必須運行檢查以便在當前事務中登記,等等。


實際上,大多數應用程序僅使用一個或幾個不同的連接配置。這意味著在執行應用程序期間,許多相同的連接將反復地打開和關閉。為了最大程度地降低打開連接的成本,ADO.NET 一種稱為連接 池 的優化技術。


連接池使新連接必須打開的次數得以減少。池程序維持物理連接的所有權。通過為每個給定的連接配置保留一組活動連接來管理連接。每當用戶在連接上調用 Open 時,池進程就會查找池中可用的連接。如果某個池連接可用,會將該連接返回給調用者,而不是打開新連接。應用程序在該連接上調用 Close 時,池進程會將連接返回到活動連接池集中,而不是關閉連接。連接返回到池中之后,即可在下一個 Open 調用中重復使用。


在 SQL Server 中,user connections 選項可配置實例建立的最大用戶連接數,默認值為 0,表示最大連接數為 32767。實際上允許的用戶連接數還取決于正使用的 SQL Server 版本以及應用程序和硬件的限制。


那么,數據庫的連接數,與客戶端連接池有什么樣的關系呢?


帶著這個疑問,我設計了一個方案,想了解它們之間有什么相互影響。

連接池連接數DB連接數峰值錯誤信息 連接峰值
400000(32767)
30000(32767)
400003000


測試代碼如下:

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;
    namespace dbConnectionTest{    class Program    {        static void Main(string[] args)        {            int maxCount = 40000;            string connstring = "Server=1card1-hzc;Database=mytest;User ID=sa;Password=sa;pooling=true;connection lifetime=0;min pool size = 1;max pool size=40000";            List<SqlConnection> collection = new List<SqlConnection>();            for (int i = 0; i < maxCount; i++)            {                Console.WriteLine(string.Format("已創建連接對象{0}", i));                try                {                    var sqlConn = new SqlConnection(connstring);                    sqlConn.Open();                    collection.Add(sqlConn);//保存連接對象                }                catch (Exception e)                {                    Console.WriteLine(e.Message);                }            }        }    }}


    我們可以查看 SQL Server 設置的最大連接數,[userconnections]  run_value=0(默認值為0即最大值32767)



    測試一:

    設置max poolsize=40000,即連接池40000,MSSQL 連接限制32767




    以上監控可以看到,MSSL 連接峰值為32717,加上數據庫系統自己默認占有的50個連接,總數為32767,即為數據庫的最大連接數。在連接過程中,CPU和內存開銷很大!


    在出錯的情況下還繼續創建對象,但是數據庫連接數是沒有增加的,連接對象都保存到連接池中,還在等待連接數據庫。


    當連接池連接數達到最大值時,如下圖到達 39999 時,程序將自動關閉并退出!本人電腦幾乎卡死!數據庫連接數回到正常,數據庫內存仍然很大,還是很卡!最后重啟數據庫服務釋放內存!


    測試二: 

    設置max poolsize=3000,即連接池3000,MSSQL 連接限制32767




    客戶端連接池最大連接為3000,再新建連接時,會因超時不能添加到連接池中,結果失敗!


    數據庫系統當前最多可連接32767,現在只連接3000+系統session,為3019。此時數據庫系統還可以繼續創建連接,只是此客戶端連接池限制而已。正常業務情況下,連接池會盡快處理沒有用的連接,讓客戶端建立新的連接。


    在數據庫中,我刪除1000個 sleeping 的 session:

      declare @i intset @i = 1000while @i<2000begin  exec('kill '+ @i)  SET @i = @i + 1end

      數據庫連接是降下來了,但是連接池還是沒有降。因為新的連接還是無法通過連接池。所以也不要刪除數據庫中 sleeping 的 session,因為連接池如果再重用連接的話,找不到數據庫中的對應連接就斷開了!


      測試三: 

      設置max poolsize=40000,即連接池40000,MSSQL 連接限制3000


      MSSQL 中執行以下代碼,然后重啟數據庫服務:

        EXEC sp_configure 'user connections',3000Reconfigure



        當通過連接池連接數據達到2982時,發生了錯誤。加上數據庫系統中的18個session,連接總數為3000.


        這個錯誤網上很常見,連接池雖然可以繼續創建新的連接,但是無法與數據庫端連接。出現此錯誤可以判斷是數據庫端沒法連接到。如果不是最大連接數出錯,可能是tcp/ip協議未開啟、端口未打開或被隔離等。


        成功與服務器建立連接,但是在登錄前的握手期間發生錯誤。(provider:tcp provider error:0 –指定的網絡名不可再用。)


        接下來在數據庫中,刪除1000個sleeping的session:

          declare @i intset @i = 1000while @i<2000begin  exec('kill '+ @i)  SET @i = @i + 1end

          連接又可以正常進行了。


          以上測試總結如下:



          現在,我們再做多幾個測試,驗證物理連接和連接池重用連接的耗時。


          測試四: 

          連接池重用:

          設置max poolsize=40000,即連接池40000,MSSQL 連接限制0(32767)。循環次數:40000


          物理連接重建:

          設置max poolsize=4000,即連接池4000,MSSQL 連接限制0(32767)。循環次數:4000


          本打算物理連接都設置40000,不過時間較久,這里測試4000,屆時可多十倍時間來對比重用連接池的時間。

            //重用: var sqlConn = new SqlConnection(connstring); sqlConn.Open(); sqlConn.Close();//重建:var sqlConn = new SqlConnection(connstring);sqlConn.Open();collection.Add(sqlConn);


            如重建次數增加10倍為40000,則平均時間比為 13:421,即重建/重用=32。重建連接比重用連接池所花費時間多32倍!所以現在的各種系統連接數據庫,基本使用連接池。但是連接池也不能過多,否則一直占用系統資源,又用不上。



            測試五:關閉連接池后數據庫會話狀態

            現在把連接池關閉 pooling=false,每次打開或者關閉連接時,console暫停。

                  for (int i = 0; i < maxCount; i++)            {                Console.WriteLine(string.Format("已創建連接對象{0}", i));                try                {                    sqlConn.Open();                    Console.WriteLine("已打開");                    Console.ReadKey(true);                    sqlConn.Close();                    Console.WriteLine("已關閉");                    Console.ReadKey(true);                }                catch (Exception e)                {                    Console.WriteLine(e.Message);                }            }


              此時我們查看MSSQL中的連接session。(在c#連接我是sa登錄的)

                SELECT * FROM sys.dm_exec_sessions where session_id>50 AND login_name='sa' SELECT * FROM sys.dm_exec_connectionsWHERE session_id IN(SELECT session_id FROM sys.dm_exec_sessions where session_id>50 AND login_name='sa')


                關閉連接時再查看。Session 已經關閉了。下次再連接,就是新的一個物理連接了。




                總結:

                連接池與MSSQL連接關系:


                連接池連接與物理連接耗時對比:


                關閉連接池:

                每次連接數據庫都是一次物理連接,關閉連接時,數據庫session也關閉


                閱讀原文:原文鏈接


                該文章在 2025/1/10 10:35:44 編輯過
                關鍵字查詢
                相關文章
                正在查詢...
                點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
                點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
                點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
                點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
                Copyright 2010-2025 ClickSun All Rights Reserved