私は、アプリケーションからリアルタイムで通知を受け取る必要があると思いますが、それらの通知が保存されているとしましょうmysqlデータベースで。 私はそれらを得るために私はmysqlサーバをポーリングし続ける必要があります(私は実際に結果が得られるまで同じ選択を繰り返し続けます)。しかし、私はそれが非常に不十分な方法であることを理解しています。空になる。もし私がそれを頻繁に行うなら、通知が非常に遅くなることはめったにありません。 したがって、条件に一致する結果が利用可能になるまで、mysqlクエリをブロックする方法があるかどうかは疑問でした。未読の通知がない場合は、実際にMySQLが条件を満たす行が挿入されるのを待つ方法がありますか?
6
A
答えて
8
を返すために、未読の通知があるまで
list = query ("SELECT * FROM `notifications` WHERE `unread`=1") ;
代わりに空のリストを返すので、それは代わりに待って、私は、新しい表を使って実施producer consumerパターンを、使用することをお勧めします"作業待ち行列"。トリガは非常に簡単なので、ストアドプロシージャの必要はありません。
- トリガは、作業キューに作業キュー・テーブルをポーリングします
- コードを取り込みます。テーブルが非常に小さいため、クエリは高速かつ低負荷になります。
- コードは、必要なものは何でもして終了したときに、テーブルから行を削除するだろう - 、
notification
のIDと「処理状況」列を持つ表を作成すると、小さなそれを維持例えば:
delimiter $
create trigger producer after insert on notifications
for each row begin
insert into work_queue (notification_id, status)
select new.id, 'ready'
where new.unread;
end; $
delimiter ;
あなたのタラ:
create table work_queue (
id int not null auto_increment,
notification_id int references notifications,
status enum ('ready', 'processing', 'failed')
);
は、作業キュー表を移入する簡単なトリガーを作成します。あなたは(あなたが失敗したアイテムをどうするかを把握する必要があります)notifications where id = <row.notification_id>
delete from work_queue where id = <row.id>
またはupdate work_queue set status = 'failed' where id = <row.id>
のいずれかに必要なものですか
select * from work_queue where status = 'ready' order by id limit 1
update work_queue set status = 'processing' where id = <row.id>
- :eは擬似コードを持っているでしょう
- スリープ1秒(このポーズは、通知のピーク到着率とほぼ同じにする必要があります。これを調整して、work_queueサイズとサーバー負荷のバランスを調整する必要があります)
- goto 1.
プロセスポーリングが1つの場合、ロックの心配はありません。複数のプロセスがポーリングしている場合は、競合状態を処理する必要があります。
関連する問題
- 1. Matlab:条件が満たされるまでプログラムを実行
- 2. 条件が満たされるまで操作をブロックする方法はありますか?
- 3. 条件が満たされるまでコントロールを無効にする方法はありますか?
- 4. 特定の条件がMySQLで満たされるまでの行の取得
- 5. ステートメント条件が満たされずにコードが実行されています
- 6. 条件が満たされるまでステートメントをループする方法Java
- 7. 2つの条件付き値が満たされた後にコンテンツを挿入してください
- 8. 条件が満たされた場合にランダム化を停止する方法
- 9. 条件が満たされるまでPHPメソッドを実行します。
- 10. 条件が満たされたらスクリプトを終了する
- 11. PHP:条件が満たされたらImplodeを停止する
- 12. MasterPage Page_PreInit()が実行される条件はありますか?
- 13. 条件が満たされたら、foreachから抜け出す方法は?
- 14. 条件が満たされずにコードが実行された場合
- 15. 条件が満たされていないプログラムをループする
- 16. ツリービューのノードが条件を満たす場合に変更する方法はありますか
- 17. 条件が満たされるまでAJAXの定期点検
- 18. 条件が満たされた場合のみフォームを送信しますか?
- 19. 時間が経過した、または条件が満たされた後にコードを実行する
- 20. 条件が満たされたときにexcelで行全体を削除する方法
- 21. MySQL - 条件があるカラムをGROUP BYする方法
- 22. JavaScript - 条件が満たされた場合、DIV内のコンテンツを囲みます
- 23. JSPで条件が満たされるまでハイパーリンクを無効にする
- 24. QBASIC:条件が満たされない場合のGOTO行の実行
- 25. 条件が満たされた場合は.data()を上書きします。
- 26. 条件が満たされたときにフォントの色を変更する
- 27. 確率条件が満たされている行のみ集計
- 28. 停止機能実行後条件が満たされてから
- 29. 特定の条件が満たされるまでスレッドを効率的にブロックする方法
- 30. 条件が満たされるたびにID番号を増やす
興味深いアイデアは、ポーリング以外の方法はありません。 ancwerに感謝します:) –
他の方法はありませんので、できるだけ早く投票したいと思っています。私はそれが私が今までに得た評判の最も厳しい10点だと言わなければならない:) – Bohemian
私はメモリテーブルを使うと良いと思う。 –