更改队列/后端数据库更新的文本
Text on change queuing / backend database updating
我有一个JavaScript表单,它通过ajax调用将对<textarea>
所做的更改保存到我的服务器上。我希望保持简单,并将change
和keyup
事件连接起来,并相应地向我的服务器发出调用。
当多个重叠调用开始导致我的数据库出现乐观并发问题时,就会出现我的问题。(带RowVersions的SQL 2008)。
- 有没有什么方法可以让ajax调用排队,这样一次就不会有多个调用
- 更好的方法是使用计时器而不是更改事件。是否每2秒更新一次?确保最终更新
onBlur
- 最好在服务器上处理,因为多个客户端(虽然不太可能)仍然可能导致相同的问题。那会是什么样子
减少调用次数的一种方法是将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(或任何中间层)处理查询所花费的时间比它应该花费的时间长。
相关文章:
- CKeditor不会在源代码模式下更新文本区域
- 基于复选框 Jquery 更新文本框
- 在里面输入新文本后更新文本区域内容的值
- 根据复选框选择 jQuery 更新文本框
- 如何在手动插入一些文本后更新文本区域的ng模型
- 使用选择框中的值更新文本区域
- 使用特定 ID 更新文本框
- SQL生成的选择菜单,根据相关值更新文本框
- JavaScript>on更改输入&选择更新文本区域
- 从下拉框更新文本框
- 当通过javascript而不是按键/复制/粘贴更新文本输入时使用的事件处理程序
- 使用 ID 更新文本区域值,而不是在 AngularJs 中使用 ng-model
- 如何使用 JavaScript 基于其他文本框更新文本框值
- 单击输入按钮时更新文本区域内容
- 更新文本框相对于表达式的值
- JS不更新文本框
- html5 画布 - 更新文本
- Elfinder文件管理器,带有多个按钮更新文本输入
- 挖空文本输入修改可观察不更新文本
- 在javascript中从servlet获得响应后更新文本区域