簡體   English   中英

WCF服務用於許多並發客戶端和數據庫訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM