1. 程式人生 > >SQL Server最大連線數問題

SQL Server最大連線數問題

最近公司測試在進行伺服器效能測試,在處理超過100個併發請求後,資料庫就崩掉了。

閒著沒事,就找了一下原因。

1.首先,看了看SQL Server伺服器屬性的配置,看到連線數為0,即不限制,SQLserver最大連線數為32767。看來應該不是這裡的問題


2.百度了一下,發現可能是程式的資料庫連線字串出了問題

自己寫了個程式碼測試一下

    class Program
    {
        private static void Main(string[] args)
        {
            TestSQLServerConnectionCount();
            Console.Read();
        }

        public static void TestSQLServerConnectionCount()
        {
            try
            {
                int maxCount = 40000;
                string connectionString =
                    "Data Source=localhost;Initial Catalog=EveryDayTest;User Id=sa;Password=sa123;";
                for (int i = 1; i < maxCount; i++)
                {
                    var db = new SqlConnection(connectionString);
                    db.Open();
                    Console.WriteLine("已建立連線物件" + i);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
     }
發現最多隻能建立100個,


然後添加了屬性Max Pool Size=101,又測了一下,恩可以了

。恩果然是這裡,不過。在測試系統的時候發現,有的時候連線數到達40多或60多或80多後就不再增長了,難道說這裡有個重複利用資料庫連線的機制?

找了一下,發現有個Pooling屬性,預設為true,於是加上了這條Pooling=false,執行一下


哇擦,已經超過了32767!!!難道說這個屬性可以讓連線反覆利用,從連線池取出來可以再次使用的連線物件?還是說根本不受連線池的最大限制?

果然,看了一下連線池的執行方式發現:

1、當一個程式執行Connection.open()時候,ADO.net就需要判斷,此連線是否支援Connection Pool (Pooling 預設為True)
(1)、如果指定為False, ADO.net就與資料庫之間建立一個連線,然後返回給程式。 (2)、如果指定為 True,ADO.net就會根據ConnectString建立一個Connection Pool,然後向Connection Pool中填充Connection。填充多少個Connection由Min Pool Size (預設為0)屬性來決定。例如如果指定為5,則ADO.net會一次與SQL資料庫之間開啟5個連線,然後將4個Connection,儲存在 Connection Pool中,1個Connection返回給程式。 2、當程式執行到Connection.close() 的時候。如果Pooling 為True,ADO.net 就把當前的Connection放到Connection Pool並且保持與資料庫之間的連線。
同時還會判斷Connection Lifetime(預設為0)屬性,0代表無限大,如果Connection存在的時間超過了Connection LifeTime,ADO.net就會關閉的Connection同時斷開與資料庫的連線,而不是重新儲存到Connection Pool中。 3、當下一次Connection.Open() 執行的時候,ADO.Net就會判斷新的ConnectionString與之前儲存在Connection Pool中的Connection的connectionString是否一致。 4、 ADO.net需要判斷當前的Connection Pool中是否有可以使用的Connection(沒有被其他程式所佔用),如果沒有的話,ADO.net就需要判斷ConnectionString設 置的Max Pool Size (預設為100) (1)、如果Connection Pool中的所有Connection沒有達到Max Pool Size,ADO.net則會再次連線資料庫,建立一個連線,然後將Connection返回給程式。 (2)、如果已經達到了 MaxPoolSize,ADO.net就不會再次建立任何新的連線,而是等待Connection Pool中被其他程式所佔用的Connection釋放,這個等待時間受SqlConnection.ConnectionTimeout(預設是15 秒)限制,也就是說如果時間超過了15秒,SqlConnection就會丟擲超時錯誤。 5、如果有可用的Connection,從Connection Pool 取出的Connection也不是直接就返回給程式,ADO.net還需要檢查ConnectionString的ConnectionReset屬性 (預設為True)是否需要對Connection 最一次reset。

-------------------摘自《http://www.studyofnet.com/news/637.html  資料庫最大連線池max pool size

不過,為什麼系統測試時到了60左右的連線數不再增長了?max pool size配置100+個啊?

求大神解釋...........