【发布时间】:2016-02-11 18:12:12
【问题描述】:
我有一个系统,其中已经为特定进程设置的服务曾经有一个 dingle 实例模式。该服务用于运行一个只能为一个客户端服务的长进程。架构如下:
现在我正在尝试为每个会话创建此 wcf 服务,以便它可以同时为两个或多个客户端运行长时间操作。因为这个过程通常需要时间。我还使用回调通道将完成百分比发送回客户端。架构如下图所示:
两种架构的主要区别在于:
- 以前只有一个用户可以运行多个进程 objects.Now 每个用户都可以运行漫长的过程,但对于不同的 对象。
- 我们在新架构中添加了回调功能 每会话服务。
-
我们还计划为用户提供便利 终止进程,如果他愿意或客户端连接是 关闭。
但在尝试实现上述目标时,我们面临以下问题。
- 耗时较长的操作,发生在数据库中,借助 static datamanager 类中的多个存储过程一一调用。
- 每个 SP 负责在多个表中添加大约 500k 行。
- 虽然从客户端终止连接会删除服务实例,但由于数据库操作是在静态类中完成的,因此控件会卡在那里,一切都停止响应。
- 我知道有一个 DBCommand.Cancel() 方法可以停止与 DBCommand 关联的操作,但由于该类是静态取消,所以这也是不可能的。
请提出解决此问题所需的架构更改。我准备分享更多细节。
【问题讨论】:
-
您真的需要将 DataManager 设为静态类吗?如果每个客户端都有自己的 DataManager 实例和可以取消的 DbCommand 会更好吗?
-
是的,我同意,该体系结构是一个非常庞大而古老的系统的一部分。由于服务以前是单实例服务,因此静态类是一个不错的选择。但是随着这个服务的变化,静态类就出现了问题。我只想要在架构上处理这种情况的最佳方式。
-
据我了解,您希望同时拥有多个客户端,而导致单例的静态行为不匹配。我会纠正的。但也许我什么都不懂
-
是的,这正是我需要的,如果没有办法让它与静态一起工作,因为重构会很麻烦。
-
感谢您的精彩解释和图表
标签: c# sql wcf architecture