WCF服务用于许多并发客户端和数据库访问

时间:2010-01-22 11:13:03

标签: c# database wcf

我是WCF服务的新手,并想知道解决以下问题的最佳方法是什么。

我有很多客户(约200 - ~500),他们都在工作日期间不断提出我的服务请求。大多数请求涉及询问底层数据库以反馈正确的响应。

我关心的是从传入请求中产生的潜在数据库连接数。如果所有客户端同时发出请求,那么数据库服务器将受到严重打击。如果可能的话,我想避免与数据库建立多少连接。

限制与WCF服务的并发连接数是否会更好,从而无意中减少了可能的数据库连接数?

我已经考虑过让服务成为生成线程来执行数据库事务的单例,这样我就可以控制线程的数量,但是这样做是否过度,会限制与服务的连接是否足够?

非常感谢您的任何建议。

3 个答案:

答案 0 :(得分:13)

正如Marcos已经提到的 - WCF具有内置的服务限制功能,您可以在服务器上进行调整。这可以防止您的数据库服务器一次充斥太多请求。

默认值为:

<serviceThrottling 
      maxConcurrentCalls="16"
      maxConcurrentSessions="10" 
      maxConcurrentInstances="26" />

有关详细信息,请参阅MSDN docs on ServiceThrottlingBehavior

这意味着WCF最多同时处理16个呼叫 - 也就是说, IF 您的WCF服务类允许同时有多个呼叫者!

与Marcos相反,我建议您将WCF服务类作为单身人士。常见的最佳实践是拥有一个简单的WCF服务类,并以每次调用的方式使用它 - 例如每个传入的请求将获得其自己的,完全独立的,新创建的WCF服务类实例 - 最多由服务限制行为定义并由WCF运行时控制。

如果您将WCF服务类设置为单例,则必须将其ConcurrencyMode设置为Multiple - 但是您需要格外小心,不要让类中的两个同时线程从彼此之下更改相同的值;多线程安全编程是一项重大挑战!或者您没有将并发模式设置为Multiple,但是您的唯一WCF服务类实例只能以串行方式处理请求,一次一个 - 不是很可扩展!

每个请求的每次调用和一个服务实例绝对是更容易的方法。使用服务限制并使用ADO.NET连接池可以实现非常强大且运行良好的环境!

另请参阅Dan Rigsby's excellent blog post on WCF service throttling以获取更多详细信息。

答案 1 :(得分:4)

如果您使用ADO连接到数据库,它应该提供连接池机制,因此您无需处理此问题。

请阅读这篇文章了解更多信息:ADO.NET Connection Pooling at a Glance

答案 2 :(得分:3)

我们有一个类似的场景,我们只使用从WebService到DB的一个连接解决它,并使用SqlServer中的MARS,它工作得很好而且非常快。 Sql Server真的知道如何处理你不必考虑的并发查询。

你可以避免打开和关闭连接的开销(显然连接池在这种情况下有帮助)

还要记住在您的网络服务中添加以下内容:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
        ConcurrencyMode = ConcurrencyMode.Multiple)]

在配置中:

<serviceThrottling maxConcurrentCalls="100"
 maxConcurrentSessions="100" 
 maxConcurrentInstances="100" />

此选项位于

  <behaviors>
      <serviceBehaviors>
        <behavior name="...">

希望这会有所帮助:)