2013-02-24 67 views
1

我正在使用MSSQL 2008R2。我寫了一個C#應用程序和故意沒有接近我的SqlConnection。在VS 2010上進行本地調試。以下是我使用的代碼:ADO.NET最大池大小行爲

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string connectionString = "server=s; database=db; User ID=sa; Password=p; Max Pool Size=1;Connect Timeout=3"; 
     SqlConnection conn = new SqlConnection(connectionString); 
     string query = "SELECT * FROM dbo.Numbers"; 
     SqlCommand comm = new SqlCommand(query, conn); 
     conn.Open(); 
     SqlDataReader reader = comm.ExecuteReader(); 
     //reader.Read() and display results to Textbox1.Text 
    } 

Max Pool Size = 1;期待在第二次瀏覽器上的第二次點擊嘗試時出錯。 爲什麼我可以去3個不同的瀏覽器(Mozilla,Chrome,IE)和每次調用點擊方法一次。這相當於3個同時連接的權利?超時錯誤僅在使用瀏覽器時發生,但在該瀏覽器上調用方法兩次。爲什麼是這樣?

回答

0

所以似乎有調試之間的差異在本地VS 2010和IIS 7.5。我必須將示例網站部署到IIS以使最大池大小按預期運行。如果我嘗試再次調用click事件,無論我嘗試使用哪個瀏覽器,都會引發超時錯誤,這是預期的。根據需要執行網站/應用程序池重新啓動/重新測試。

出於某種原因,本地調試在VS 2010中繞過最大池大小限制。每個瀏覽器可能會調用點擊事件,在我的例子中打開3個sqlconnection對象。唯一一次拋出超時錯誤的是如果你停留在瀏覽器中並且通過雙擊方法。奇怪的行爲,但開發人員應該意識到的東西。

0

只是因爲你離開了連接對象開放並不意味着三個獨立的連接。 .NET框架實際上利用SQL Server中的連接池並通過連接字符串來管理它。由於所有三個請求的連接字符串都是相同的,並且連接可用,所以不存在衝突。

現在,如果您要模擬一種情況,即您有一個長時間運行的查詢啓動其中一個請求,然後再次嘗試再次點擊 - 您可能會發現它會先等待 - 然後您會得到一個超時例外。

下面是連接在MSDN上的.NET框架彙集lengthy and dry document

+0

在您發佈的鏈接,它們包圍的SqlConnection對象使用{}塊,關閉連接,一旦退出範圍,它返回到池中,我的例子沒有。連接池將重用連接,但如果我選擇不關閉連接,則必須創建另一個池。我的查詢很快,只有10位數字返回。 – invulnarable27 2013-02-25 19:44:41

+0

@ invulnarable27:是的,他們正在發佈'使用'聲明,這是一個很好的做法,所以記住這一點。但是,與你的情況無關。然而,**因爲第一個查詢是short **,所以當它建立一個新的連接時,它不會在池中創建額外的連接** **請記住,池在連接字符串上工作。如果您要在第一個請求上創建一個*長時間運行的查詢*,然後在後續請求上嘗試創建另一個連接,則它將按預期失敗,因爲它需要*從池中獲取另一個連接。 * – 2013-02-26 12:27:39

+0

我同意你長時間運行的查詢將保持在sqlconnection,導致在後續請求上創建第二個連接。我通過不調用connection.Close()來模擬一個長查詢(不確定)。當在IIS中部署時出現錯誤,VS的行爲不正確。 – invulnarable27 2013-02-27 08:18:41