2013-02-04 138 views
1

我有一个JavaScript窗体,通过ajax调用将对<textarea>所做的更改保存到我的服务器。我希望保持简单的事情,并且连接了changekeyup事件,并相应地向我的服务器发起呼叫。关于更改排队/后端数据库更新的文本

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

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

回答

0

SQL服务器应该能够处理文本字段的更新速度不够快,这样就不会导致并发问题。我建议你使用一个分析器并找出延迟的确切位置。

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

在这种情况下,您将在应用程序范围中创建一个静态类,它将实现一个命令列表。您的Ajax后处理程序将在列表中注册SQL命令并立即退出。该类本身将在单独的线程上以串行方式处理每个命令。你可以看到,你将不得不做一些管道工作来让它工作,所以最好的选择可能仍然是为什么sql server(或任何中间层)花费的时间比它应该处理查询。

0

您可以减少通话次数的一种方法是将ajax通话延迟几秒钟,以查看用户是否要继续打字。你改变/ KEYUP监听器的主体将有这样的事情在里面:

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

你也应该像你在你的第二个选项提到的发送上模糊Ajax调用。

相关问题