2013-02-04 24 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調用。