1

<textarea>ajax呼び出しを介してサーバーに加えられた変更を保存するJavaScriptフォームがあります。私は物事をシンプルに保ち、イベントとイベントを接続し、それに応じてサーバーへの呼び出しを開始することを望んでいましchangekeyup

私の問題は、複数の重複する呼び出しがデータベースで楽観的同時実行性の問題を引き起こし始めたときに発生します。(RowVersionsを使用したSQL 2008)。

  1. 一度に複数の通話を行うことがないように、ajax呼び出しをキューに入れる方法はありますか?
  2. より良いアプローチは、変更イベントの代わりにタイマーを使用することです。2秒ごとに更新しますか?最終更新を保証しonBlurますか?
  3. 複数のクライアントが(可能性は低いですが)同じ問題を引き起こす可能性があるため、これはサーバー上で処理するのが最適でしょうか。それはどのように見えるでしょうか?
4

2 に答える 2

1

呼び出し回数を減らす方法の 1 つは、ajax 呼び出しを数秒間遅らせて、ユーザーが入力を続けるかどうかを確認することです。変更/キーアップ リスナーの本体には、次のようなものが含まれます。

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

また、2 番目のオプションで述べたように、blur で ajax 呼び出しを送信する必要があります。

于 2013-02-04T23:52:05.540 に答える
0

SQLサーバーは、同時実行の問題が発生しないように、テキストフィールドの更新を十分に高速に処理できる必要があります。プロファイラーを使用して、レイテンシーが正確にどこにあるかを把握することをお勧めします。

それでも呼び出しをキューに入れたい場合は、ajaxをキューに入れることで実行できるかどうかわかりません。ajaxはマルチスレッド環境のIISワーカープロセスで処理されるためです。そうは言っても、シングルトンパターンを使用して独自のプロセスキューを実装するオプションがあります。

この場合、コマンドリストを実装する静的クラスをアプリケーションスコープに作成します。AjaxポストハンドラーはSQLコマンドをリストに登録し、すぐに終了します。クラス自体は、リストから外れた各コマンドを個別のスレッドでシリアルに処理します。

ご覧のとおり、動作させるには少し配管を行う必要があるため、SQLサーバー(または任意の中間層)がクエリの処理に必要以上に時間がかかる理由を理解するのが最善の方法かもしれません。

于 2013-02-04T23:36:05.473 に答える