Frage

Ich bin nicht sehr vertraut mit Datenbanken und was sie außerhalb der CRUD-Operationen bieten.

Meine Forschung hat mich dazu gebracht, zu Trigger . Im Grunde sieht es aus wie Trigger diese Art von Funktionalität bieten:

  

(von Wikipedia )

     

Es ist in der Regel drei auslösenden Ereignisse, die Auslöser dazu führen, „Feuer“:

     
      
  • INSERT Ereignis (als neuer Datensatz in die Datenbank eingefügt werden).
  •   
  • UPDATE Ereignis (als Aufzeichnung wird geändert).
  •   
  • DELETE Ereignis (wie ein Datensatz gelöscht wird).
  •   

Meine Frage ist: Gibt es eine Möglichkeit kann ich in Java mitgeteilt werden (vorzugsweise die Daten enthält, die geändert) von der Datenbank, wenn ein Datensatz / Deleted / Inserted aktualisiert wird irgendeine Art von Trigger-Semantik?

Was könnten einige alternative Lösungen für dieses Problem sein? Wie kann ich auf die Datenbank Ereignisse hören?

Der Hauptgrund, warum ich dies tun will, ist ein Szenario wie diese :

Ich habe 5-Client-Anwendungen alle in verschiedenen Prozessen / vorhandenen über verschiedene PCs. Sie alle teilen eine gemeinsame Datenbank (Postgres in diesem Fall).

Ermöglicht ein Client sagen ändert einen Datensatz in der DB, die alle 5 der Kunden sind „interessiert“ an. Ich versuche, für die Kunden der Weisen zu denken „mitgeteilt“ der Änderung wird (vorzugsweise mit den betroffenen Daten angebracht ), anstatt sie für die Daten zu einem bestimmten Intervall abgefragt wird.

War es hilfreich?

Lösung

Oracle verwenden Sie Setup einen Trigger auf einem Tisch können und haben dann den Auslöser eine JMS-Nachricht senden. Oracle hat zwei verschiedene JMS-Implementierungen. Sie können dann einen Prozess haben, der für die Meldung ‚hören‘ die JDBC-Treiber verwenden. Ich habe diese Methode verwendet, um Änderungen vs. Polling meine Anwendung zu verdrängen. Wenn Sie eine Java-Datenbank (H2) verwenden, haben Sie zusätzliche Optionen. In meiner aktuellen Anwendung (SIEM) Ich habe Auslöser in H2, die Änderungsereignisse veröffentlichen mit JMX.

Andere Tipps

Sie die Datenbank nicht mischen (die die Daten enthält) und Ereignisse auf diese Daten.

Trigger ist eine Möglichkeit, aber in der Regel werden Sie eine Persistenz-Schicht in der Anwendung haben. Diese Schicht kann wählen Ereignisse abzufeuern, wenn bestimmte Dinge passieren -. Sagen zu einem JMS Thema

Trigger ist eine letzte verzweifelte Sache, wie Sie auf relationale Elementen dann sind Betrieb, sondern als „Ereignisse“ auf den Daten. (Zum Beispiel kann ein „Update“, könnte in Wirklichkeit Karte zu einer „Gesellschaft geänderten gesetzlichen Namen“ Ereignis) Wenn Sie auf den db verlassen, werden Sie die Einsätze zur Karte haben und Updates zurück auf reale Ereignisse im Leben .... die Sie wusste schon über!

wie Event Stream Processing - -

Sie können dann andere Sachen auf diesen Mitteilungen Schicht Ereignisse zu finden, die andere daran interessiert sind,

.

James

Hmm. So sind Sie mit PostgreSQL und Sie wollen zu „hören“ für Veranstaltungen und werden „gemeldet“, wenn sie auftreten?

http://www.postgresql.org/docs/8.3/ statisch / SQL-listen.html http://www.postgresql.org/docs/8.3/static/sql -notify.html

Hope, das hilft!

Der Aufruf externe Prozesse aus der Datenbank ist sehr herstellerspezifisch.

Direkt an der Spitze von meinem Kopf:

  • SQLServer können CLR Programme aufrufen aus Trigger,

  • postgresql können beliebige C aufrufen Funktionen dynamisch geladen,

  • MySQL können beliebige C-Funktionen aufrufen, aber sie müssen kompiliert in werden,

  • Sybase-System machen können Anrufe, wenn Set bis zu tun.

Die einfachste Sache zu tun ist, die insert / update haben / löschen Trigger einen Eintrag in einigen Log-Tabelle machen und haben Ihr Java-Programm, dass die Tabelle überwachen. Gute Spalten in der Log-Tabelle zu haben, wären Dinge wie EVENT_CODE, LOG_DATETIME und LOG_MSG.

Wenn Sie eine sehr hohe Leistung benötigen oder brauchen 100ks von Datensätzen zu handhaben, das ist wahrscheinlich ausreichend.

Ich denke, zwei Dinge sind verwirrend. Sie sind beide sehr db herstellerspezifisch.

Der erste soll ich „Trigger“ nennen. Ich bin sicher, dass es mindestens ein DB-Anbieter ist, den Auslöser ist anders als dies denkt, aber mit mir tragen. Ein Auslöser ist ein serverseitiges Stück Code, das auf Tabelle angebracht werden kann. Zum Beispiel könnten Sie eine PSQL gespeicherte Prozedur bei jedem Update in Tabelle X laufen Einige Datenbanken können Sie diese in realen Programmiersprachen schreiben, andere nur in ihrer Variante von SQL. Auslöser sind in der Regel recht schnell und skalierbar.

Das andere werde ich „Ereignisse“ nennen. Dies sind Auslöser, die in der Datenbank ausgelöst, mit denen Sie einen Event-Handler in Ihrem Client-Programm definieren. IE, zu jeder Zeit gibt es Updates für die Kunden-Datenbank, Feuer updateClientsList in Ihrem Programm. Zum Beispiel mit Python und Firebird siehe http://www.firebirdsql.org/devel/python/docs/3.3.0/beyond-python-db-api.html#database-event-notification

Ich glaube, die vorherigen Vorschlag, einen Monitor zu verwenden, eine gleichwertige Art und Weise ist dies unter Verwendung eines anderen Datenbank zu implementieren. Vielleicht Orakel? MSSQL Benachrichtigungsdienste, in einer anderen Antwort erwähnt ist eine weitere Umsetzung dieser auch.

Ich würde sogar so weit gehen zu sagen, dass Sie besser würde wirklich wissen, warum Sie die Datenbank mögen, dass Ihr Client-Programm informieren, andernfalls sollten Sie mit Server-Trigger bleiben.

Was Sie fragen, hängt vollständig sowohl auf der Datenbank, die Sie verwenden und Rahmen Sie mit Ihrer Datenbank zu kommunizieren, verwenden.

Wenn Sie so etwas wie Hibernate als Persistenz-Schicht verwenden, hat es eine Reihe von Zuhörern und Abfangjäger, die Sie Datensätze können in die und aus der Datenbank überwachen gehen.

Es gibt ein paar verschiedene Techniken, die hier je nach der Datenbank Sie verwenden. Eine Idee ist, die Datenbank abzufragen (was ich bin sicher, dass Sie versuchen zu vermeiden). Grundsätzlich könnte man auf Änderungen überprüfen jeder so oft.

Ein andere Lösung (wenn Sie mit SQL Server 2005) ist Notification Service zu verwenden, obwohl diese techonology angeblich in SQL 2008 ersetzt wird (wir haben keinen reinen Ersatz noch nicht gesehen, aber Microsoft hat darüber öffentlich gesprochen) .

Wenn Sie Oracle verwenden, lesen Sie in diesem früheren Post .

Dies ist in der Regel, was die Standard-Client / Server-Anwendung ist für. Wenn alle Einsätze / updates / löscht der Server-Anwendung durchlaufen, die dann die Datenbank modifiziert, dann Client-Anwendungen können sich als viel einfacher finden, welche Änderungen vorgenommen wurden.

Wenn Sie postgresql verwenden hat es Fähigkeit Benachrichtigungen von JDBC-Client zu hören .

Ich würde vorschlagen, einen Zeitstempel Spalte, letzte Aktualisierung zusammen möglicherweise mit dem Benutzer den Datensatz aktualisiert wird, und lassen Sie dann die Clients überprüfen ihre lokalen Datensatz Zeitstempel gegen die des persistenten Datensatzes.

Die zusätzliche Komplexität einen Rückruf / Trigger-Funktionalität hinzuzufügen, ist es einfach nicht wert meiner Meinung nach, es sei denn, die von der Datenbank-Backend und der Client-Bibliothek unterstützt werden, wie zum Beispiel die Benachrichtigungsdienste für SQL Server 2005 angeboten ADO verwendet zusammen. NET.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top