Sql server webrequest服务与本地数据库搜索

Sql server webrequest服务与本地数据库搜索,sql-server,httpwebrequest,windows-server-2008,Sql Server,Httpwebrequest,Windows Server 2008,我有一个运行多线程的应用程序,其中一部分流程涉及向Web服务发出http post请求,在Web服务中,我提交的参数将在数据库中检查是否已经存在,如果不存在,则插入 数据库本身位于运行应用程序的同一服务器上。我们最初将它托管在不同的服务器上,但它崩溃了,硬件故障..无法处理我每秒发出的所有请求 现在,我在向服务发出请求时遇到了服务器错误,我想知道哪种方法更高效、更快…而且更不容易出错 使用向服务发出请求的现有方法,解决问题或 我自己在本地访问数据库,检查表,自己做插入,这显然会减慢进程 我试图在

我有一个运行多线程的应用程序,其中一部分流程涉及向Web服务发出http post请求,在Web服务中,我提交的参数将在数据库中检查是否已经存在,如果不存在,则插入

数据库本身位于运行应用程序的同一服务器上。我们最初将它托管在不同的服务器上,但它崩溃了,硬件故障..无法处理我每秒发出的所有请求

现在,我在向服务发出请求时遇到了服务器错误,我想知道哪种方法更高效、更快…而且更不容易出错

  • 使用向服务发出请求的现有方法,解决问题或
  • 我自己在本地访问数据库,检查表,自己做插入,这显然会减慢进程

  • 我试图在这里避免问题,设置该服务的程序员说,他已经完成了他自己的所有工作,我应该将我的请求留出更多的空间,但我仍然不明白为什么在移动之前突然出现主键违反错误,如果我发送了一个表中已经存在的参数,我将收到一个set响应,而不是一个内部服务器错误。

    Webservice请求是异步的,因此您将无法解释PK冲突错误。处理这种情况有多种方法:

  • webservice宿主代码应该被更改以处理这样的情况:当PK存在时,它应该返回与第一次发送请求时相同的响应。调用请求是独立的,并且在不同的线程上,并且永远不会知道另一个请求已经插入了相同的值。WS的全部意义在于,多个请求可以同时从任何地方进入。业务逻辑应该处理它们同时进入的情况

  • 更改代码以直接访问数据库(如您所述)。这不会以任何方式使过程变慢(尽管更改代码需要提前完成工作),因为WS-request必须通过HTTP协议,而您的代码将通过代码提供的ADO或OLEDB提供程序直接访问

  • 您可能会将请求排队,然后逐个命中,直到一个处理程序收到响应后再命中下一个请求。我不喜欢这一点,因为它不可伸缩——违背了WS的目的(但如果程序员不更改WS代码,您可能会被卡住)


  • WS-coder建议的解决方案是荒谬的。没有办法将您的请求隔开,这样就不会导致PK冲突。您无法知道哪些请求已经插入,或者哪些其他请求已经在处理中。此外,间隔请求并不能使整个应用程序具有可伸缩性-您的前端(或其他正在等待响应的部分)将最终等待。

    您没有提到您得到的确切错误-我假设您得到的是PK违规错误?可能是您的#1和#3的混合体。。。提交后,请求将排队。主web服务线程生成子线程来执行该工作。每个子线程在队列中分配了不同的项。子线程处理其工作并将结果作为原始队列的更新或响应队列上的新项返回。事务隔离级别可用于保持子线程的一致性。队列管理可以在db(service broker)中进行。然后,您可以通过限制子线程的数量和选择检查结果的频率来控制吞吐量。是的,这将起作用(还需要一些前期工作)。虽然排队可能是剩下的唯一选项,但在这种情况下,我真的不是一个粉丝,因为如果应用程序获得大量点击,它将成为一个瓶颈-以应用程序要求的频率生成子线程可能无法由WS-host处理-这是我真正认为应该处理的地方…当然,由于Oded的应用程序与SQL位于同一台服务器上,因此资源使用将更加重要。最后,我完全同意M.R.“隔开”请求是一种非解决方案。在我看来,您要么调整事情以避免过度争用,要么在工作负载如此严重的情况下使用队列。