2012-01-23 4 views
1

timeOutを使用して15秒おきにDIVを自動更新するサイトを作成しました。 これは非常に効果的ですが、DIVが実際に更新されるまでに最大5分かかる場合があります。変更する前にスクリプトを20回に送信します。高価な帯域幅とサーバーのパフォーマンスのかなり良い無駄:setTimeoutからAJAXコールにロングポーリングタイムアウトで

私は多くのことについて多くを読んでいたLong Pollingと私はそれを行ってきた。

私のAJAX呼び出しがあった。

intval = window.setTimeout(function() { 
    $.ajax({ 
    type: 'GET', 
    cache: false, 
    url: 'url', 
    beforeSend: function() { $('#timerimg').attr('src', 'img/icons/loading.gif'); }, 
    success: function(data) { $('#ajaxcontent').html(data); }, 
    complete: function() { $('#timerimg').attr('src', 'img/icons/stop.gif'); } 
    }); 
}, 15000); 

この機能は、繰り返しに保持されることにタイムアウト機能を作ったすべての時間を、リフレッシュされてページ内に配置しました。

は今、私はhi.txtへのURLを設定し、Hello World!を書き、それが常に終了し、新しい投票をやって作っていた場合

(function poll() { 
    $.ajax({ 
    type: 'GET', 
    cache: false, 
    url: 'url', 
    success: function(data) { $('#ajaxcontent').html(data); }, 
    complete: poll, 
    timeout: 30000 
    }); 
})(); 

シンプルなロングポーリング機能を作成するためにhttp://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jqueryに従うことをしようとしています。明らかに多くの同時世論調査を意味します。

これを修正するにはどうすればよいですか?

AND:

autorefreshing DIV巨大SQL-Serverクエリからの計算と大きなチャートです。だから、ちょうどちょうどちょうどちょうど.getRows()のSQLのクエリの後に(元と比較して)に変更があったかどうかを確認する必要がありますか?

私はjQueryとASP-Classicですべてをやっています。

答えて

2

ロングポーリングはクライアント専用のソリューションではありません。ロング・ポーリングでは、何か変更されるまでサーバがコールを保持する必要があります。これは、ログインしているすべてのクライアントに対して同時接続の1つを使用することを意味します。これは同時実行性を制限する一部のサービスプロバイダには問題がある可能性があるため、ISPポリシーを確認してから503を取得してください。

ここで複数の問題に取り組んでいます。サーバーは、最後の要求を更新する必要があるかどうかを追跡したり、キャッシュされた応答を返すだけです。長いポーリングを使用している場合、サーバーは接続が変更されるまで接続を保持します。

以前はインターバルポーリングを使用していました。 IEの帯域幅の半分(2つの同時最大)を頻繁に更新するのではなく、そのルートを(サーバー側のキャッシュで)続けることをお勧めします。状況が変わっていなければ、サーバーはあなたの問い合わせに対して「偽」の応答を返すようにしてください。

+0

非常に大きなバックボーンインターネット接続に設置された自分のラックサーバーであるため、同時接続制限が問題になるとは思われません。現在の問題は、データベースが瞬時に更新されることがないということです。私はネット上でいくつかのブログを読んでいます。呼び出された.aspファイルでSQLクエリを実行すると、まずデータベースから元のデータがフェッチされ、その後、データが変更されるまで同じデータを何度も何度も繰り返しフェッチするループを実行し、新しいデータをブラウザに送り返します...しかし、これでは膨大な帯域幅が作成されませんか? – Behrens

+0

データベースのバックエンドに関しては、データが更新されるたびにタイムスタンプがあるか、DBAに提供するように依頼する必要があります。そのタイムスタンプで、最後のタイムスタンプをチェックすることができます。最後のポーリングよりも大きい場合は、一度大きなクエリを取得します。プルするたびに、新しい時間であなたの投票を更新してください。また、あなたの長い投票でデータベースを叩くべきではありません。あなたのユースケースが応答性のために何秒間でもそれを眠るように教えてください。 –

+0

それでは、データベースの各行に「最後に変更された」タイムスタンプを追加してから、その1つのタイムスタンプを選択して、リクエストのタイムスタンプを保持しないようにしてください。データベースからすべてを選択し、数学を実行してユーザーにプッシュします。それはまだ2秒ごとにDBからのプルです。しかし、それはお金の問題ではない内部trafik ..それは良い解決策になる可能性がありますか? – Behrens

関連する問題