web-dev-qa-db-ja.com

MySQLリッスン通知同等

MySQLにPostgresQLの notify および listen に相当するものはありますか?基本的に、Javaアプリケーションサーバーでトリガーをリッスンする必要があります。

20
smk

いいえ、このような組み込み関数はまだありません。 「読み取り」0/1のような既成のフラグで選択してデータベースを「ping」(1〜5秒ごと)する必要があります。後

SELECT * FROM mytable WHERE read = 0

read = 1で更新します

2
P0ZiTR0N

さて、私が見つけたのは、mysqlでUDF関数を作成して、C/C++で記述する必要がある以外は何でもできるということです。次に、データベースの更新のトリガーから呼び出して、更新が発生したときにアプリケーションに通知できます。セキュリティ上の懸念があることがわかりました。自分では使っていませんでしたが、見たところ、やりたいことなどを成し遂げられるもののようです。

http://dev.mysql.com/doc/refman/5.6/en/adding-udf.html

9
Tomasz

これを行う必要があったので、更新通知自体を送信するようにアプリケーションを設計しました。

例えば。 -シナリオ-ユーザーAがレコード1を確認していますユーザーAが開いている間に、ユーザーBがレコード1の更新を保存します。

処理する:

私は自分のソケットサーバーをWindowsサービスとして作成しました。基本的には、queのようなシステムを設計しました。

EntityType EntityID NoticeType

EntityTypeが通知を送信する必要があるデータレイヤーのPocoのタイプである場合、EntityIDはSQLで変更された行の主キー値(pocoの値)であり、NoticeTypeは1更新、2挿入、および3削除されました。

ソケットサーバーは、安全な接続でサーバー側のアプリケーションコードからの接続を受け入れます。「クライアント側のコードは、サーバー側のアプリケーションコードによって送信されるように設計された要求を行うことができません」

ソケットサーバーは次のようなメッセージを受け入れます

900 1 1023 1

つまり、サーバーは、ID1023のエンティティタイプ1「Person」が更新されたことを関係するクライアント接続に通知する必要があります。

サーバーは、ユーザーがレコードを見ると、レコードとレコードのIDに関心があるものとしてソケットサーバーに登録され、クライアント側のJavaScriptのWebソケットコードによって実行されるため、ユーザーに通知する必要があることを認識しています。

レコード1は、IsNewフィールドとIsDirtyフィールドを持つアプリコードのPOCOです。 「EntityFrameWork6とMySqlの使用」UserBの保存によって(既存のデータの保存だけでなく)実際の変更が発生した場合、IsDirtyはUserBのPOCOのポストバックでtrueになります。

アプリケーションコードは、レコードがダーティであることを確認してから、ID1023のエンティティ1が更新されたことを示す「許可される」サーバー側の送信済みソケットでソケットサーバーに通知します。

ソケットサーバーはそれを認識し、キューに入れます。

.Netであるため、SocketServerウィンドウサービスで実行されているデータレイヤーと同じpocosを使用する関係ユーザー向けのクラスがあります。 linqを使用して、キュー内のエンティティのエンティティタイプとプライマリキーIDに一致するエンティティを操作しているユーザーを選択します。

次に、それらのユーザーをループして、901 1 1023 1のようなソケットを送信し、エンティティが更新されたことをユーザーに通知します。

クライアント側のJavaScriptはそれを受信し、ユーザーBのページがレコード1でajaxポストバックを実行しますが、UserAで何が起こるかは異なります。

ユーザーAが変更を行っている場合は、ポップアップが表示され、何が変更されたか、[保存]をクリックしてどの変更を保持するかを尋ねると新しい値が表示されます。 UserAに変更がない場合は、上部に「レコードの変更:自動的に更新されました」という通知バーが表示され、数秒後に期限切れになるajaxポストバックが実行されます。

これに対する短所、1。非常に複雑です。2。アプリケーションの外部からの挿入/更新/削除操作をキャッチしません。

私の場合、2は発生しません。また、2が発生した場合は、「そのための管理ページを作成する」という通知キュー要求を手動で作成する方法を知っている自分または別の開発者が行います。

3
Ryan Mann

Githubプロジェクト mysql-notification は、MySQLユーザー定義関数MySQLNotification()をMySQLへのプラグインとして提供し、ソケットインターフェイスを介して通知イベントを送信します。このプロジェクトには、Javaまたはその他のソケットサービスに適合させることができる通知イベントを受信するサンプルNodeJSテストサーバーが含まれています。

使用例:

$ DELIMITER @@
$ CREATE TRIGGER <triggerName> AFTER INSERT ON <table> 
  FOR EACH ROW 
  BEGIN 
     SELECT MySQLNotification(NEW.id, 2) INTO @x; 
  END@@

プロジェクトには、OSXおよびLinuxの完全なソースコードとインストール手順が含まれています。ライセンスはGNU v3です。

2
Tony O'Hagan