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

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

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

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

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

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

非常感谢任何建议。

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

默认值为:

 

有关更多详细信息,请参阅ServiceThrottlingBehavior上的MSDN文档 。

这意味着WCF最多同时处理16个调用 – 也就是说, 如果您的WCF服务类允许同时有多个调用者!

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

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

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

另请参阅Dan Rigsby关于WCF服务限制的优秀博客文章,以获取更多详细信息。

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

请阅读本文以获取更多信息: ADO.NET连接池概览

我们有一个类似的场景,我们只使用从WebService到DB的一个连接来解决它,并使用SqlServer中的MARS,它完美且非常快速地运行。 Sql Server真的知道如何处理你不必考虑的并发查询。

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

还要记住在您的Web服务中添加如下内容:

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

并在配置中:

  

这个选项在里面

     

希望这可以帮助 :)