欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

SQL Server 連接池和最大連接數(shù)占用內(nèi)存和CPU硬件資源分析研究

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

連接到數(shù)據(jù)源可能需要很長(zhǎng)時(shí)間。為了最大程度地降低打開連接的成本,ADO.NET 使用一種稱為 連接池的優(yōu)化技術(shù),這會(huì)最大程度地降低重復(fù)打開和關(guān)閉連接的成本。.NET Framework 數(shù)據(jù)提供程序處理連接池的方式有所不同。


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


實(shí)際上,大多數(shù)應(yīng)用程序僅使用一個(gè)或幾個(gè)不同的連接配置。這意味著在執(zhí)行應(yīng)用程序期間,許多相同的連接將反復(fù)地打開和關(guān)閉。為了最大程度地降低打開連接的成本,ADO.NET 一種稱為連接 池 的優(yōu)化技術(shù)。


連接池使新連接必須打開的次數(shù)得以減少。池程序維持物理連接的所有權(quán)。通過(guò)為每個(gè)給定的連接配置保留一組活動(dòng)連接來(lái)管理連接。每當(dāng)用戶在連接上調(diào)用 Open 時(shí),池進(jìn)程就會(huì)查找池中可用的連接。如果某個(gè)池連接可用,會(huì)將該連接返回給調(diào)用者,而不是打開新連接。應(yīng)用程序在該連接上調(diào)用 Close 時(shí),池進(jìn)程會(huì)將連接返回到活動(dòng)連接池集中,而不是關(guān)閉連接。連接返回到池中之后,即可在下一個(gè) Open 調(diào)用中重復(fù)使用。


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


那么,數(shù)據(jù)庫(kù)的連接數(shù),與客戶端連接池有什么樣的關(guān)系呢?


帶著這個(gè)疑問(wèn),我設(shè)計(jì)了一個(gè)方案,想了解它們之間有什么相互影響。

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


測(cè)試代碼如下:

    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("已創(chuàng)建連接對(duì)象{0}", i));                try                {                    var sqlConn = new SqlConnection(connstring);                    sqlConn.Open();                    collection.Add(sqlConn);//保存連接對(duì)象                }                catch (Exception e)                {                    Console.WriteLine(e.Message);                }            }        }    }}


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



    測(cè)試一:

    設(shè)置max poolsize=40000,即連接池40000,MSSQL 連接限制32767




    以上監(jiān)控可以看到,MSSL 連接峰值為32717,加上數(shù)據(jù)庫(kù)系統(tǒng)自己默認(rèn)占有的50個(gè)連接,總數(shù)為32767,即為數(shù)據(jù)庫(kù)的最大連接數(shù)。在連接過(guò)程中,CPU和內(nèi)存開銷很大!


    在出錯(cuò)的情況下還繼續(xù)創(chuàng)建對(duì)象,但是數(shù)據(jù)庫(kù)連接數(shù)是沒(méi)有增加的,連接對(duì)象都保存到連接池中,還在等待連接數(shù)據(jù)庫(kù)。


    當(dāng)連接池連接數(shù)達(dá)到最大值時(shí),如下圖到達(dá) 39999 時(shí),程序?qū)⒆詣?dòng)關(guān)閉并退出!本人電腦幾乎卡死!數(shù)據(jù)庫(kù)連接數(shù)回到正常,數(shù)據(jù)庫(kù)內(nèi)存仍然很大,還是很卡!最后重啟數(shù)據(jù)庫(kù)服務(wù)釋放內(nèi)存!


    測(cè)試二: 

    設(shè)置max poolsize=3000,即連接池3000,MSSQL 連接限制32767




    客戶端連接池最大連接為3000,再新建連接時(shí),會(huì)因超時(shí)不能添加到連接池中,結(jié)果失敗!


    數(shù)據(jù)庫(kù)系統(tǒng)當(dāng)前最多可連接32767,現(xiàn)在只連接3000+系統(tǒng)session,為3019。此時(shí)數(shù)據(jù)庫(kù)系統(tǒng)還可以繼續(xù)創(chuàng)建連接,只是此客戶端連接池限制而已。正常業(yè)務(wù)情況下,連接池會(huì)盡快處理沒(méi)有用的連接,讓客戶端建立新的連接。


    在數(shù)據(jù)庫(kù)中,我刪除1000個(gè) sleeping 的 session:

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

      數(shù)據(jù)庫(kù)連接是降下來(lái)了,但是連接池還是沒(méi)有降。因?yàn)樾碌倪B接還是無(wú)法通過(guò)連接池。所以也不要?jiǎng)h除數(shù)據(jù)庫(kù)中 sleeping 的 session,因?yàn)檫B接池如果再重用連接的話,找不到數(shù)據(jù)庫(kù)中的對(duì)應(yīng)連接就斷開了!


      測(cè)試三: 

      設(shè)置max poolsize=40000,即連接池40000,MSSQL 連接限制3000


      MSSQL 中執(zhí)行以下代碼,然后重啟數(shù)據(jù)庫(kù)服務(wù):

        EXEC sp_configure 'user connections',3000Reconfigure



        當(dāng)通過(guò)連接池連接數(shù)據(jù)達(dá)到2982時(shí),發(fā)生了錯(cuò)誤。加上數(shù)據(jù)庫(kù)系統(tǒng)中的18個(gè)session,連接總數(shù)為3000.


        這個(gè)錯(cuò)誤網(wǎng)上很常見(jiàn),連接池雖然可以繼續(xù)創(chuàng)建新的連接,但是無(wú)法與數(shù)據(jù)庫(kù)端連接。出現(xiàn)此錯(cuò)誤可以判斷是數(shù)據(jù)庫(kù)端沒(méi)法連接到。如果不是最大連接數(shù)出錯(cuò),可能是tcp/ip協(xié)議未開啟、端口未打開或被隔離等。


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


        接下來(lái)在數(shù)據(jù)庫(kù)中,刪除1000個(gè)sleeping的session:

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

          連接又可以正常進(jìn)行了。


          以上測(cè)試總結(jié)如下:



          現(xiàn)在,我們?cè)僮龆鄮讉€(gè)測(cè)試,驗(yàn)證物理連接和連接池重用連接的耗時(shí)。


          測(cè)試四: 

          連接池重用:

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


          物理連接重建:

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


          本打算物理連接都設(shè)置40000,不過(guò)時(shí)間較久,這里測(cè)試4000,屆時(shí)可多十倍時(shí)間來(lái)對(duì)比重用連接池的時(shí)間。

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


            如重建次數(shù)增加10倍為40000,則平均時(shí)間比為 13:421,即重建/重用=32。重建連接比重用連接池所花費(fèi)時(shí)間多32倍!所以現(xiàn)在的各種系統(tǒng)連接數(shù)據(jù)庫(kù),基本使用連接池。但是連接池也不能過(guò)多,否則一直占用系統(tǒng)資源,又用不上。



            測(cè)試五:關(guān)閉連接池后數(shù)據(jù)庫(kù)會(huì)話狀態(tài)

            現(xiàn)在把連接池關(guān)閉 pooling=false,每次打開或者關(guān)閉連接時(shí),console暫停。

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


              此時(shí)我們查看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')


                關(guān)閉連接時(shí)再查看。Session 已經(jīng)關(guān)閉了。下次再連接,就是新的一個(gè)物理連接了。




                總結(jié):

                連接池與MSSQL連接關(guān)系:


                連接池連接與物理連接耗時(shí)對(duì)比:


                關(guān)閉連接池:

                每次連接數(shù)據(jù)庫(kù)都是一次物理連接,關(guān)閉連接時(shí),數(shù)據(jù)庫(kù)session也關(guān)閉


                閱讀原文:原文鏈接


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