我正在寻找关于我正在处理的问题的最佳选择的一些反馈。
为了给你一些背景,我最近继承了一个破碎的业务应用程序(我们的项目正在使用它,所以我们负责修复它),我来自SharePoint开发背景,所以有点C#,ASP.NET和SQL。
目前我们在应用程序中存在一个问题,我们不断收到超时错误,我已将其缩小到Web应用程序调用一堆存储过程来更新其他表中的状态字段,此时某些更改可能会影响其他表的状态对象。
如果没有彻底改造这个应用程序,我已经确定我们最好的选择是卸载这些存储过程以在后台运行而不是绑定到UI。我看了几个选项,包括:
现在我们已将这些存储过程移动到每天两次的脚本中,该脚本会更新所有对象,但这只是一个临时修复。
我正在考虑两个选项,我希望得到一些关于你认为最佳选择的实施的指导:
继续使用该作业并让执行存储过程将队列中的项目排队到作业将循环的数据库中,直到为空。执行存储过程必须在添加新条目时检查作业是否正在运行,然后采取相应措施。
建议我查看使用Service Broker,但我根本不熟悉它的用法。我知道它可能是一个更好的整体解决方案,因为它允许我以更交易的方式排队这些更新。
我认为这两个选项都是可行的,尽管我需要一些帮助来理解第二个选项的实现。我的另一个困境是这些存储过程在45s到20m之间运行,我如何通知用户更改了他/她的更新对象?这是我回退使用这个工作的地方,因为我可以简单地将一个用户字段添加到'队列'中,并让存储的proc在最后发送一个快速的电子邮件。
想法,建议?也许我在想这个?
答案 0 :(得分:0)
如果您使用的是.NET 4.5和C#5.0,请使用async,如果您使用的是.NET 4.0,请使用TPL。它们具有相同的底层(几乎)和异步功能,建立在TPL(带有一些额外的内部构件)上。
无论如何,TPL将是一个合适的选择。
答案 1 :(得分:0)
听起来像Service Broker将是解决这个问题的绝佳解决方案。确实有一点学习曲线可以让你了解它是如何工作的,但它基本上非常简单,特别是当你的实现在一个数据库中时。
http://msdn.microsoft.com/en-US/library/ms345108(v=SQL.90).aspx
有一个很好的(并且很简短)介绍它的工作方式答案 2 :(得分:0)
看看Asynchronous Procedure Execution。但我会先看看是否可以改进更新,也许一个简单的索引可以消除超时,和/或尝试利用snapshot isolation。尝试不承诺对应用程序代码进行“重大改进”会更加简单。
我还必须敦促你阅读Waits and Queues。这是一种用于识别性能瓶颈的SQL Server方法。是一种将“超时”问题缩小到更具可操作性(阻塞,IO,索引等)的好方法。