[英]Is there a way to tell how many “Concurrent Calls” are being made to a WCF service?
[英]WCF Service for many concurrent clients and database access
我是WCF服務的新手,並想知道解決以下問題的最佳方法是什么。
我有很多客戶(~200 - ~500),這些客戶都在工作日期間不斷提出我的服務請求。 大多數請求涉及詢問底層數據庫以反饋正確的響應。
我關心的是從傳入請求中產生的潛在數據庫連接數。 如果所有客戶端同時發出請求,那么數據庫服務器將受到嚴重打擊。 如果可能的話,我想避免與數據庫建立多少連接。
是否更好地限制與WCF服務的並發連接數,從而無意中減少了可能的數據庫連接數?
我已經看過使服務成為生成線程來執行數據庫事務的單例,因此我可以控制線程的數量,但這是否過度,會限制與服務的連接是否足夠?
非常感謝任何建議。
正如Marcos已經提到的--WCF具有內置的服務限制功能,您可以在服務器上進行調整。 這可以防止您的數據庫服務器一次充滿過多請求。
默認值為:
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentSessions="10"
maxConcurrentInstances="26" />
有關更多詳細信息,請參閱ServiceThrottlingBehavior上的MSDN文檔 。
這意味着WCF最多同時處理16個調用 - 也就是說, 如果您的WCF服務類一次允許多個調用者!
與Marcos相反,我不建議您將WCF服務類作為單例。 常見的最佳實踐是擁有一個簡單的WCF服務類,並以每次調用的方式使用它 - 例如,每個傳入的請求將獲得其自己的,完全獨立的,新創建的WCF服務類實例 - 最多由服務限制行為並由WCF運行時控制。
如果您將WCF服務類設置為單例,則必須將其ConcurrencyMode設置為Multiple - 但是您需要格外小心,不要讓類中的兩個同時線程從彼此之下更改相同的值; 多線程安全編程是一項重大挑戰! 或者您沒有將並發模式設置為Multiple,但是您的唯一WCF服務類實例只能以串行方式處理請求,一次一個 - 不是很可擴展!
每個請求的每次調用和一個服務實例絕對是更容易的方法。 服務限制到位,並使用ADO.NET連接池,這是一個非常強大和良好的環境!
另請參閱Dan Rigsby關於WCF服務限制的優秀博客文章,以獲取更多詳細信息。
如果您使用ADO連接到數據庫,它應該提供連接池機制,因此您不需要處理此問題。
請閱讀本文以獲取更多信息: ADO.NET連接池概覽
我們有一個類似的場景,我們只使用從WebService到DB的一個連接解決它,並使用SqlServer中的MARS,它工作得非常好而且非常快。 Sql Server真的知道如何處理你不必考慮的並發查詢。
你可以避免打開和關閉連接的開銷(顯然連接池在這種情況下有幫助)
還要記住在您的Web服務中添加如下內容:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
並在配置中:
<serviceThrottling maxConcurrentCalls="100"
maxConcurrentSessions="100"
maxConcurrentInstances="100" />
這個選項在里面
<behaviors>
<serviceBehaviors>
<behavior name="...">
希望這可以幫助 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.