我是WCF服务的新手,并想知道解决以下问题的最佳方法是什么。
我有很多客户(约200 - ~500),他们都在工作日期间不断提出我的服务请求。大多数请求涉及询问底层数据库以反馈正确的响应。
我关心的是从传入请求中产生的潜在数据库连接数。如果所有客户端同时发出请求,那么数据库服务器将受到严重打击。如果可能的话,我想避免与数据库建立多少连接。
限制与WCF服务的并发连接数是否会更好,从而无意中减少了可能的数据库连接数?
我已经考虑过让服务成为生成线程来执行数据库事务的单例,这样我就可以控制线程的数量,但是这样做是否过度,会限制与服务的连接是否足够?
非常感谢您的任何建议。
答案 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="...">
希望这会有所帮助:)