使用设置为 ConcurrencyMode.Multiple 和 InstanceContextMode.PerCall 的 WCF 服务行为属性时是否可能出现并发问题?

2024-02-11

我们有一个 WCF 服务,可以进行大量事务性 NHibernate 调用。有时我们会看到 SQL 超时,即使调用正在更新不同的行并且表设置为行级锁定。

深入研究日志后,看起来不同的线程正在进入代码中的同一点(我们的事务使用块),并且更新在提交时挂起。但这没有意义,因为我们认为以下服务类属性强制每个服务调用有一个唯一的执行线程:

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

我们最近将并发模式更改为ConcurrencyMode.Single并且尚未遇到任何问题,但该错误非常难以重现(如果有人有任何关于清除此类错误的想法,请告诉我!)。

不管怎样,这一切都让我想到了我的问题:即使 ConcurrencyMode 设置为 multiple,PerCall 的 InstanceContextMode 不应该在服务内强制执行线程安全吗?同一服务实例如何为两个调用提供服务?

Thanks!


让两个不同的 WCF 客户端(即代理)引用 WCF 服务的同一实例的唯一方法是使用InstanceContextMode=InstanceContextMode.Single。如果缩放是一个问题,那么这是一个糟糕的选择,所以你想使用PerCall如果可以的话。

当你使用PerCall, each CALL向WCF服务获取自己的WCF服务实例。不共享服务实例,但这并不意味着它们不共享相同的后端存储(例如数据库、内存、文件等)。只要记住,PerCall允许每个call同时访问您的 WCF 服务。

The ConcurrencyMode http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx设置控制服务本身的线程模型。设置为Single限制所有 WCF 服务实例在同一线程上运行。因此,如果您有多个客户端同时连接,它们在 WCF 服务端一次只会执行一个。在这种情况下,您可以利用 WCF 来提供同步。正如您所看到的,它会正常工作,但请将此视为仅对同步进行宏观级别的控制 - 每个 WCF 服务调用将在下一个调用执行之前完整执行。

Setting ConcurrencyMode to Multiple但是,将允许所有 WCF 服务实例同时执行。在这种情况下,您负责提供必要的同步。将此视为对同步进行微观级别的控制,因为您只能同步每个调用中需要同步的部分。

我希望我已经解释得足够好,但这里是 MSDN 文档的片段ConcurrencyMode http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx万一:

将 ConcurrencyMode 设置为 Single 指示系统限制 一个线程的服务实例 一次执行,这释放了 让你免于处理线程 问题。值为 Multiple 意味着 服务对象可以通过以下方式执行 任一时刻有多个线程。在 这种情况下,必须保证线程 安全。

EDIT

你问

那么,在使用 ConcurrencyMode.Single 时,使用 PerCall 与 Single 相比是否会提高性能?或者反之亦然?

这可能取决于服务。

With InstanceContextMode.PerCall,通过代理为每个调用创建一个新的服务实例,因此您需要处理实例创建的开销。假设您的服务构造函数没有做太多事情,这不会成为问题。

With InstanceContextMode.Single,在应用程序的生命周期中仅存在一个服务实例,因此实际上不存在与实例创建相关的开销。然而,这种模式只允许一个服务实例来处理将进行的每个调用。因此,如果同时进行多个调用,则每个调用都必须等待其他调用完成才能执行。

无论如何,我是这样做的。使用PerCall实例上下文与Multiple并发。在 WCF 服务类中,创建静态成员来为您管理后端数据存储,然后根据需要使用以下方法同步对这些静态成员的访问:lock陈述,volatile字段等。这使您的服务可以很好地扩展,同时仍然保持线程安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用设置为 ConcurrencyMode.Multiple 和 InstanceContextMode.PerCall 的 WCF 服务行为属性时是否可能出现并发问题? 的相关文章

随机推荐