大量数据库访问使WCF服务无响应

时间:2012-05-21 17:20:28

标签: multithreading wcf entity-framework

我有一个WCF双工服务(使用net.tcp绑定进行会话实例化),可能会进行大量的数据库访问。当它进入高db-access例程时,它对任何WCF服务调用都没有响应。

我检查了CPU利用率,虽然很高,却不是100%。这是一个4核盒子。

WCF似乎没有处理任何实际请求。不仅没有调用服务操作,而且我在WCF堆栈中还有一些安全自定义行为也没有被调用。这让我觉得WCF在某种程度上越来越缺乏线程,因此无法为访问分配新的线程。

我不认为这是一个限制问题,因为当有一些当前的服务会话(少于5个)时,我可以实现这一点。

有问题的数据库操作是数千个单行插入。这是通过单个实体框架上下文完成的,该上下文每500次调用处理和重建,以减少实体框架内部缓存的内存累积。目标数据库是SQL Express 2008 R2。

此服务中有相当数量的工作线程。所有都由任务并行库实例化...一些是常规的短期任务(使用CLR线程池),另一些是长期运行的任务(获取自己的CLR线程),但不是这些是I / O线程(除非CLR正在做一些我不知道的魔法)。数据库写入正在长时间运行的任务中发生。

是否有任何WCF或调试诊断工具可以报告或可视化WCF线程,工作线程,I / O线程和WCF限制的当前状态?

环境摘要

  • WCF服务托管在Windows服务中
  • WCF服务使用net.tcp双工绑定
  • WCF服务是基于会话的(双工合同要求)
  • 只有一个Windows服务实例,但WCF服务对象的多个实例将根据WCF的要求进行实例化。
  • WCF服务操作可以快速将工作委托给Windows服务中持久的后台线程。所有WCF操作都会快速返回,然后通过WCF双工回调通道涓流后续线程生成的其他结果。
  • 所有数据库访问都在后台工作线程上完成。没有WCF线程用于长时间运行的工作。
  • WCF服务具有单个自定义安全行为。没有其他行为(例如可靠的消息传递等)

1 个答案:

答案 0 :(得分:0)

如果您正在使用会话实例,则每个客户端连接都有一个主机服务。如果主持人正在访问数据库,那么我说它阻止& amp;在完成任务之前,我们无法处理其客户的任何其他电话。您可以更改其异步工作方式。调用一个start方法,它启动工作线程上的数据库活动并立即返回。要么有一个进度方法来检查状态,要么是因为你使用了双工,请在完成后让主机向客户发出信号。

或者wcf服务是否不接受新客户?