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

And*_*ndy 11 c# database wcf

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

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

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

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

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

非常感谢任何建议.

mar*_*c_s 13

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

默认值为:

<serviceThrottling 
      maxConcurrentCalls="16"
      maxConcurrentSessions="10" 
      maxConcurrentInstances="26" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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