クライアントアプリがデータベースの更新にすぐに反応するための最良の方法は何ですか?
質問
データベース内のデータの更新に対する即時の反応をプログラムする最良の方法は何ですか?
私がオフハンドで考えることができる最も単純な方法は、データベースに特定のデータの変更をチェックし、定義された時間の長さをもう一度チェックするのを継続的に待つスレッドです。このソリューションは私にとって無駄で、最適ではないように思われるので、私はより良い方法があるかどうか疑問に思っていました。
結局のところ、GmailのようなWebアプリケーションは、新しい電子メールが送信された直後に私の受信トレイを更新できるように思われます。確かに、私のクライアントは常に更新を継続的にチェックしていません。彼らがこれをする方法はAjaxのものだと思いますが、Ajaxが私が知らないリモート関数呼び出しのように振る舞うことができると思います。 Gmailがこれをどのように行うか知りたいと思っていますが、私が最も知りたいのは、データベースを使用して一般的なケースでこれを行う方法です。
編集:データベース自体ではなく、クライアントコードの更新にすぐに反応したいので、トリガーがこれを行うことができないことに注意してください。基本的に、データベースの変更が行われたら、ユーザーに通知を取得するか、画面を更新してもらいたいです。
解決
ここには基本的に2つの問題があります。
ブラウザが、タイトなループでポーリングすることなく、Webアプリケーションサーバーから非同期イベントを受信できるようにする必要があります。
Webアプリケーションが、タイトなループでポーリングすることなく、データベースから非同期イベントを受信できるようにする必要があります。
問題#1の場合
あなたが探していると思うテクニックの種類については、これらのウィキペディアリンクを参照してください。
編集:2009年3月19日 - 出会ったばかりです reversehttp これは問題#1にとって興味深いかもしれません。
問題#2の場合
ソリューションは、使用しているデータベースと、おそらくサーバーが使用するデータベースドライバーにも具体的になるでしょう。たとえば、 postgreSql 使用します 聞く と 通知します. 。 (そして、投票するリスクがあるため、おそらくデータベーストリガーを使用して、テーブルのデータの変更時にnotifyコマンドを呼び出すでしょう。)
これを行う別の可能な方法は、データベースが持っている場合です インターフェイス 動的ライブラリにリンクするストアドプロシージャまたはトリガーを作成するには(すなわち、dllまたは.soファイル)。その後、サーバーの信号コードを書き込むことができます Cまたは何でも.
同じテーマでは、一部のデータベースでは、ような言語でストアドプロシージャを作成できます。 Java、Ruby, Python と その他. 。シグナリングメカニズムには、これらのいずれかを使用することができる場合があります(CのようにCのようにマシンコードDLLにコンパイルするものではありません)。
それがあなたに始めるのに十分なアイデアを与えることを願っています。
他のヒント
結局のところ、GmailのようなWebアプリケーションは、新しい電子メールが送信された直後に私の受信トレイを更新するように見えると思います。確かに、私のクライアントは常に更新を継続的にチェックしていません。彼らがこれをする方法はAjaxのものだと思いますが、Ajaxが私が知らないリモート関数呼び出しのように振る舞うことができると思います。 Gmailがこれをどのように行うか知りたいと思っていますが、私が最も知りたいのは、データベースを使用して一般的なケースでこれを行う方法です。
いつかWiresharkで覗いてみてください... Googleトラフィックがかなり定期的に進行していると思われます。
DBに応じて、トリガーが役立つ場合があります。私が書いたアプリはトリガーに依存していますが、ポーリングメカニズムを使用して、何かが変わったことを実際に「知る」ことができます。 DBの変更を伝えることができない限り、いくつかのポーリングメカニズムが必要です、と私は言います。
ちょうど私の2セント。
さて、 一番 方法はデータベースです 引き金. 。指定していないDBMの能力に依存します。
編集:Gmailのようなアプリケーションが実際にAjax Pollingを使用する方法です。インストールします データを改ざんします Firefox拡張機能を説明するための拡張機能。そこにあるトリックは、「No News」ケースで、投票クエリを盲目的に迅速に保つことです。
残念ながら、データをWebブラウザにプッシュする方法はありません - リクエストへの応答としてデータを送信することしかできません - それはHTTPの仕組みです。
ajaxは使用したいものです:1秒後にWebサービスを呼び出すことは過度ではありません。Webサービスを設計して少量のデータを受信し、少量を返送し、非常に迅速に実行して生成できる場合その応答。