1

我有一个 JavaScript 表单,可以<textarea>通过 ajax 调用保存对我的服务器所做的更改。我希望保持简单,并连接事件changekeyup相应地触发对我的服务器的调用。

当多个重叠调用开始导致我的数据库出现乐观并发问题时,就会出现我的问题。(带有 RowVersions 的 SQL 2008)。

  1. 有什么办法可以让ajax调用排队,这样我一次就不会超过一个?
  2. 更好的方法是使用计时器而不是更改事件。每2秒更新一次?确保最终更新onBlur
  3. 这是否最好在服务器上处理,因为多个客户端(虽然不太可能)仍然可能导致相同的问题。那会是什么样子?
4

2 回答 2

1

减少调用次数的一种方法是将 ajax 调用延迟几秒钟,以查看用户是否会继续输入。你的 change/keyup 监听器的主体中会有这样的东西:

if(timeoutId){ 
    // prevent last timeout from sending the ajax call
    clearTimeout(timeoutId);
    timeoutId = 0;
}
timeoutId = setTimeout(sendAjaxToSaveState,delayInMilliseconds);

您还应该像您在第二个选项中提到的那样在 blur 上发送 ajax 调用。

于 2013-02-04T23:52:05.540 回答
0

SQL 服务器应该能够足够快地处理文本字段的更新,以免导致并发问题。我建议您使用分析器并找出延迟的确切位置。

之后,如果您仍然希望将呼叫排队,我不确定是否可以通过排队 ajax 来完成,因为 ajax 是在多线程环境中的 IIS 工作进程中处理的。话虽如此,您可以选择使用单例模式来实现您自己的进程队列。

在这种情况下,您将在应用程序范围内创建一个静态类,该类将实现一个命令列表。您的 Ajax 后处理程序将使用列表注册 SQL 命令并立即退出。该类本身将在单独的线程上以串行方式处理列表中的每个命令。

正如您所看到的,您必须做一些工作才能使其正常工作,因此最好的选择可能仍然是弄清楚为什么 sql server(或任何中间层)花费的时间比处理查询的时间要长。

于 2013-02-04T23:36:05.473 回答