10

データベース内のデータの更新に対する即時の反応をプログラムするための最良の方法は何ですか?

私がオフハンドで考えることができる最も簡単な方法は、データベースに特定のデータの変更がないかチェックし、事前定義された時間の間、データベースを再度チェックするのを継続的に待機するスレッドです。この解決策は私には無駄で最適ではないように思われるので、もっと良い方法があるかどうか疑問に思いました。

結局のところ、GmailのようなWebアプリケーションは、新しい電子メールが送信された直後に受信トレイを更新できるようです。確かに、私のクライアントは常に更新をチェックしているわけではありません。彼らがこれを行う方法はAJAXを使用する方法だと思いますが、AJAXがリモート関数呼び出しのようにどのように動作するかはわかりません。Gmailがこれをどのように行うのか知りたいのですが、私が最も知りたいのは、データベースを使用した一般的なケースでこれを行う方法です。

編集:トリガーがこれを実行できないことがわかっている限り、データベース自体ではなく、クライアントコードの更新にすぐに反応したいことに注意してください。基本的に、データベースに変更が加えられたら、ユーザーに通知を受け取るか、画面を更新してもらいたいと思います。

4

4 に答える 4

7

ここには基本的に 2 つの問題があります。

  1. ブラウザーが、タイトなループでポーリングすることなく、Web アプリケーション サーバーから非同期イベントを受信できるようにする必要があります。

  2. タイトなループでポーリングすることなく、Web アプリケーションがデータベースから非同期イベントを受信できるようにする必要があります。

問題#1の場合

あなたが探していると思われるテクニックの種類については、これらのウィキペディアのリンクを参照してください。

編集: 2009 年 3 月 19 日 -問題 #1 に関連するかもしれないReverseHTTPに遭遇しました。

問題#2の場合

解決策は、使用しているデータベースに固有のものであり、おそらくサーバーが使用するデータベース ドライバーにも依存します。たとえば、PostgreSQLではLISTENNOTIFYを使用します。(そして、反対票を投じられるリスクがあるため、おそらくデータベース トリガーを使用して、テーブルのデータが変更されたときに NOTIFY コマンドを呼び出すでしょう。)

これを行う別の方法として、動的ライブラリ (つまり、DLL または .so ファイル) にリンクするストアド プロシージャまたはトリガーを作成するためのインターフェイスがデータベースにある場合があります。次に、 C などでサーバー シグナリング コードを記述できます。

同じテーマで、一部のデータベースでは、Java、RubyPythonなどの言語でストアド プロシージャを記述できます。これらのいずれかを (C のようにマシン コード DLL にコンパイルする代わりに) シグナリング メカニズムに使用できる場合があります。

開始するのに十分なアイデアが得られることを願っています。

于 2009-02-26T01:39:07.617 に答える
1

さて、最良の方法はデータベーストリガーです。指定していないDBMSがそれらをサポートする能力に依存します。

編集をやり直してください:Gmailのようなアプリケーションがそれを行う方法は、実際にはAJAXポーリングを使用しています。Tamper Data Firefox拡張機能をインストールして、動作を確認してください。そこにある秘訣は、「ニュースがない」場合にポーリングクエリを盲目的に高速に保つことです。

于 2009-02-25T17:39:49.577 に答える
1

残念ながら、Web ブラウザにデータをプッシュする方法はありません。リクエストに対する応答としてデータを送信することしかできません。これが HTTP の仕組みです。

ただし、AJAX は使用したいものです。Web サービスを 1 秒に 1 回呼び出すことは過剰ではありません。ただし、Web サービスが少量のデータを受信し、少量を送り返し、非常に迅速に実行して生成できるように設計されている場合に限ります。その反応。

于 2009-02-25T18:01:30.663 に答える