更改队列/后端数据库更新的文本

Text on change queuing / backend database updating

本文关键字:更新 文本 数据库 后端 队列      更新时间:2023-09-26

我有一个JavaScript表单,它通过ajax调用将对<textarea>所做的更改保存到我的服务器上。我希望保持简单,并将changekeyup事件连接起来,并相应地向我的服务器发出调用。

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

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

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

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

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

SQL服务器应该能够足够快地处理文本字段的更新,这样就不会导致并发问题。我建议您使用探查器并找出延迟的确切位置。

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

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

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