2014-09-23 25 views
2

我使用ADO.NET和SQL Server 2008完成了我的桌面應用程序。我計劃在通過本地網絡連接到Windows 7計算機上的SQL Server數據庫的10臺計算機上運行我的應用程序。是否存在SQL Server的最大連接限制

如果所有電腦同時運行,是否有任何問題?

那麼SQL Server連接池呢?

需要注意的是,當我試圖找到SQL Server上使用此命令我的數據庫的活動連接:

sp_who 

我發現了超過20個活動的連接。

這是否會導致問題?

+1

看看http://dba.stackexchange.com/questions/31173/max-connections-sql-server-express-could-have – user3473830 2014-09-23 23:54:31

回答

0

對於Windows 7乳寧SQL服務器:

似乎只有20個併發連接其他設備允許(Source)然而,具體取決於這20個設備,可能會更多的連接運行的應用程序可以啓動,並可能導致你所看到的。

此外,請確保您正確地關閉應用程序內的連接作爲必要條件,並且不要讓連接不必要地打開。

的任何Windows服務器操作系統,應用以下的情況下,你需要同時連接更大:

How to: Set User Connections (SQL Server Management Studio) - MSDN

要設置用戶連接

  1. 在對象資源管理器,右鍵單擊服務器,然後單擊屬性。

  2. 單擊連接節點。

  3. 在連接下,在併發連接框中鍵入的最大數目,或通過32767選擇從0的值來設定被允許同時連接到 SQL Server的實例的用戶的最大數目 。

  4. 重新啓動SQL Server。

的最大連接數,因此,爲32,767,這是通過SQL Server 2014確實

您可以運行sp_configure來獲得當前的運行值也是如此。

0

如果您只查看十個客戶端,SQL Server應該能夠處理該問題。

除此之外,它只是設計這種負載的問題。例如,你想確保你在正確的時間發現了正確的鎖。從本質上講,讓多個併發客戶端訪問同一個數據庫與多個併發線程在一臺機器上訪問相同變量是一樣的。這個數據庫比一個int稍微聰明一些,但是你仍然要確保你處於事態發展的前沿。

例如,假設您有一個要完成的Tasks表,並且它有一個ID列和一個LastCompleted時間列。在一個單一的客戶端,您可能需要寫一些東西,訪問這樣的:

  1. 提取下一個具有LastCompleted < DATEADD(HOUR, -1, GETDATE())
  2. 做這個任務,這需要5分鐘
  3. UPDATE表設置LastCompleted = GETDATE()

然後,您可以很容易地每小時完成所有任務。

但是,如果您遇到多個客戶端訪問,這將導致多個客戶端多次抓取相同的任務,並且同時進行。在這種情況下,您可能需要另一列指示InProgressAsOf作爲日期,然後您可以根據需要重試孤立任務,但絕不會冒險重疊事件發生的風險。即使如此,你可能會想在你的UPDATE上使用OUTPUT條款來確保它是全部原子的。

  1. 取從UPDATE Tasks SET InProgressAsOf = GETDATE() OUTPUT DELETED.* WHERE LastCompleted < DATEADD(HOUR, -1, GETDATE()) AND InProgressAsOf < DATEADD(MINUTE, -10, GETDATE())
  2. 結果做這個任務,這需要5分鐘
  3. UPDATE表設置LastCompleted = GETDATE()

但是,是的,只要你在這些之上多線程操作的細微差別,你應該很好地對同一個數據庫運行10個併發連接。

相關問題