2017-01-17 8 views
0

現在、新しいエントリがテーブルに作成されたときに、実際に物事を送信するアナウンサーを作ろうとしています。Python MySQL選択クエリループ

現在、私が気づいた唯一の方法は新しいものをtheresの場合、選択クエリと保存された最新のクエリIDを持つすべての1秒を尋ねるのループを作っています。

私はそれを速く作りたいのですが、1秒を持つことは毎回ちょっと、すべてをスローダウンされる照会します。

別の方法がありますか?

+0

1秒間に1回のクエリでシステムの速度が低下しますか?どんな風に見えますか? –

+0

それはありませんが、おそらく最良の方法ではありません。特にシングルスレッド化されて以来、他のプロセスの速度が遅くなる可能性があります。 – Fragkiller

答えて

0

はい、良い方法は、メッセージキューを使用することです。新しいデータをデータベースにコミットした後、メッセージキューにポストするようにクライアントをコーディングします。彼らは完全なデータをキューに投稿する必要はなく、アプリケーションがデータをチェックする時間であることを知らせるイベントだけです。エントリーがありますまで

一方、あなたのアナウンサーアプリがキューで待つことができます。つまり、データベースをポーリングするのではなく、何かがメッセージキューに現れるまでブロックしているだけです。

多くのメッセージキューの実装があります。例:上記の

しかし、あなたはデータベースに書き込むアプリケーションのコードを変更する必要があります。できない場合は、アプリケーションの変更を必要としない別の方法として、Change Data Captureツールを使用して、バイナリログをストリーミングしてデータベースの変更を監視する方法があります。この方法でCDCツールを使用する方法の記事は、MySQL CDC, Streaming Binary Logs and Asynchronous Triggersです。

一部の人々は、アナウンサーのアプリを知らせるMySQLのトリガーを書くように誘惑されています。 これを試してはいけません。トランザクションがコミットする前にトリガーが起動します。だからあなたのアナウンサーのアプリケーションは、データを見ることができる前にデータについて通知を受けるでしょう。また、トランザクションがロールバックされる可能性がありますが、通知が送信されるため、アナウンサーは読めないデータの誤ったレポートを取得します。

メッセージキューを使用する場合、書き込み側のアプリケーションはの後にだけキューにポストし、データをデータベースにコミットする必要があります。