私は、アプリケーションからリアルタイムで通知を受け取る必要があると思いますが、それらの通知が保存されているとしましょう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. 条件が満たされた場合に限り、Mysqlを挿入します。
- 2. 2つの条件が満たされた場合にVBAを挿入する
- 3. string.contains()の条件が満たされるまで待ちます
- 4. 挿入前のMySQLテストと条件が満たされた場合のキャンセル
- 5. 条件が満たされたらリスト内のオブジェクトのインスタンスを削除する方法はありますか?
- 6. 条件が満たされた場合に行を削除する方法
- 7. 条件が満たされるまで再試行する方法
- 8. 条件が満たされた後すぐに活動インジケータを停止する方法はありますか?
- 9. 特定の条件が満たされてから挿入されるまでのトランザクションをロールバックする
- 10. 条件が満たされるまでコントロールを無効にする方法はありますか?
- 11. 条件が満たされるまで操作をブロックする方法はありますか?
- 12. Matlab:条件が満たされるまでプログラムを実行
- 13. 特定の条件がMySQLで満たされるまでの行の取得
- 14. 条件が満たされたときにシーケンスを繰り返す方法
- 15. SQL Sum条件が満たされるまでの行番号
- 16. 条件が満たされた場合にMySQLの行を削除する方法
- 17. MYSQL:条件を満たす行の数を見つける
- 18. 条件が満たされたときに同じ行全体を挿入します
- 19. 特定の条件が何回満たされたかを数える方法がわかりません
- 20. 条件が満たされるまでステートメントをループする方法Java
- 21. ステートメント条件が満たされずにコードが実行されています
- 22. ステートメントは実行されますが条件が満たされない場合
- 23. Excelで3つのAND条件を満たす必要があります
- 24. 特定の条件が満たされない場合に表に挿入する方法
- 25. 2つの条件付き値が満たされた後にコンテンツを挿入してください
- 26. if/esleifブロックで満たされている状態があっても条件が直接入ります
- 27. 条件が満たされない場合は、入力に戻る必要があります
- 28. 条件が満たされた場合にランダム化を停止する方法
- 29. MasterPage Page_PreInit()が実行される条件はありますか?
- 30. pthread条件変数またはシグナルを待つ方法はありますか?
興味深いアイデアは、ポーリング以外の方法はありません。 ancwerに感謝します:) –
他の方法はありませんので、できるだけ早く投票したいと思っています。私はそれが私が今までに得た評判の最も厳しい10点だと言わなければならない:) – Bohemian
私はメモリテーブルを使うと良いと思う。 –