MySQL Auf neue Datensätze in einer Datenbank reagieren

nonickatall

Mitglied
Hallo, ich schreibe gerade eine neue Anwendung und habe da eine MySQL Datenbank im Hintergrund, wo in einer Tabelle aus unterschiedlichen Quellen Datensätze landen.

Nun möchte ich in einer Klasse auf neue Datensätze lauschen, diese interpretieren und dann die entsprechenden Klassen aufrufen, die dann irgendwelche Aktionen ausführen.

Nun ist meine Frage, wie man das am effizientesten macht.

Macht man in dieser Klasse einen loop und schickt dann Events in einen Event Listener der entsprechenden Klasse?

Oder gibt es sogar Event Listener die auf neue Datensätze auf einer MySQL Datenbank reagieren?

Oder gar einen 3. Weg von dem ich noch gar nichts weiß?

Was wäre da der sinnvollste Weg?

Vielen Dank im Voraus für die Erhellung. Liebe Grüße Ralf
 
Da ist das Design aus meiner Sicht relativ schlecht gewählt.

a) Es ist durchaus üblich, dass man die "diversen Quellen" nicht direkt auf die Datenbank zugreifen lässt sondern über z.B. eine REST API. In so einem Fall hättest Du direkt die Möglichkeit zu reagieren.

b) Je nachdem, um was es da wie geht, wäre ggf. auch über JMS nachzudenken.

Ansonsten: nein, MySQL kann zwar mit Triggern auf neue Datensätze reagieren, aber das sind dann rein interne MySQL Verarbeitungen. Du hast also keine direkte Möglichkeit, in einer laufenden JVM etwas zu machen. Es wäre natürlich denkbar, prinzipiell auch aus MySQL heraus dann einen REST Call durchzuführen, aber da hätte ich durchaus Bauchschmerzen bezüglich Laufzeitverhalten und Stabilität. (Wie es gehen könnte würde man z.B. unter https://stackoverflow.com/questions...i-from-a-trigger-or-stored-procedure-in-mysql sehen)

Die Lösung mit dem ständigen Pollen bleibt natürlich weiterhin eine Möglichkeit. Aber wie am Anfang gesagt: Das wäre vom Design her eher unüblich.

Wenn s weiter um den zentralen Server geht, der dann deine Pis (und auch andere Clients) steuert und so:
Ich hätte da einen Ansatz gewählt, dass der Server neben der Datenbank auch einen Service hat. Z.B. mit Spring Boot. Mittels JPA und Co ist da auch der Aufbau relativ unproblematisch und schnell möglich.
Dann können die Clients direkt darauf zugreifen um Daten abzufragen und zu liefern.

Prinzipiell habe ich das mir auch schon einmal überlegt um mir so ein System aufzubauen, um Clients zu überwachen und Dinge zentral ausführen zu lassen. Aber den Java Overhead schätze ich nicht wirklich. Aber aktuell bin ich sogar dabei, mir das als Beispiel zu nehmen um mit Swagger eine API zu definieren ... (Da ist aber meine Einarbeitung in Swagger das Ziel und nicht wirklich die Erstellung einer solchen Lösung).
 
Ich glaube ich habe mich da, auch vielleicht in meinem größeren Beitrag über die Struktur meiner Software, völlig missverständlich ausgedrückt.

Was ich mache ist, dass ich ein größeres Gebäude mit verschiedenen Raspberrys auf denen jeweils eine Java Applikation läuft, über entsprechende Relaisboards mit Eingängen und natürlich Ausgängen steuern will.

Das Ganze hatte ich mal programmiert unter Python, das läuft auch schon einigen Jahre sehr gut und zuverlässig, allerdings bisher auf nur einem Gerät. Da ich aber nun immer mehr Steuerungs Aufgaben habe, ist meine Idee das auf drei oder mehr Geräten laufen zu lassen. Da die Struktur der Verarbeitung aber immer die Gleiche ist, kann ein Raspberry das für die anderen mit übernehmen. Beispielsweise geht eine SMS ein, wird auf den Berechtigten und Berechtigungen geprüft, es wird aus dem Text in der SMS ein oder mehrere Befehle extrahiert und abhängig davon was gemacht werden soll, geht diese Information an einem der drei Raspberrys, die dann ihrerseits Relays schalten oder was auch immer...

Da ich das ganze Rechte System und alles schon seit langem benutze und das auch sehr gut funktioniert und letztlich über mehrere Tabellen auf dem SQL Server läuft, ich (Berechtige, Befehle, Rechte) mich aber entschieden habe, das ganze auf Java zu programmieren, weil ich erstens bei Python ein paar Einschränkungen habe und zweitens, ich ohnehin mit Java mal anfangen wollte, um gegebenenfalls auch mal Apps zu programmieren, beziehungsweise mit einer GUI zu arbeiten, suche ich nun Detaillösungen für mich.

Da jetzt mit einer REST API, die, wie ich gelesen hatte, für verteilte Systeme, vor allem auch übers Internet genutzt wird, halte ich für völlig überzogen.

Mir reicht es, wenn da eine Java Klasse läuft, die im Loop auf den SQL-Server zugreift und schaut ob eben ein neuer Datensatz vorliegt, der abgearbeitet werden soll. Und dann via Event die entsprechende Klasse, die beispielsweise ein Relais schaltet ausführt. Da ich diese “Loop Klasse“ natürlich auf allen drei Geräten laufen lassen kann, können die dann jeweils autark schauen, ob Jobs für sie vorliegen.

Ich weiß dass das funktioniert und ich das ans laufen kriege, aber weswegen ich hier frage ist:

Vielleicht gibt es ja in Java viel bessere Methoden um so etwas zu realisieren, die ich als Java Anfänger noch nicht kenne, und jetzt Dinge programmiere, die mir dann später auf die Füße fallen.

Lg
Ralf
 
Ich habe sowas vor ein paar Jahren mal gemacht. Folgendes Vorgehen: Ich habe nicht die MySQL-Tabellen per JDBC o.ä. überwacht, sondern das binlog per Filesystem - WatchService. Wenn ein WatchEvent ausgelöst wurde, dann habe ich das binlog entsprechend geprüft. Das Vorgehen hat natürlich entscheidende Nachteile. Es wird Zugriff auf das Dateisystem der DB gebraucht. Für produktive Systeme geht das natürlich gar nicht. Ich schätze dieses Vorgehen als ein großes Risiko für den Betrieb der DB ein. Ich bin mir auch nicht sicher ob diese Vorgehen mit aktuellen MySQL-Versionen noch möglich ist. Für einen Bastel-Rechner und ein Hobby-Projekt ist das Vorgehen evtl. akzeptabel. Ansonsten kann ich kneitzel nur zustimmen.
 
Da es ja um Zugriffe von anderen Systemen geht, wird er keinen Zugriff auf das Filesystem haben....

Und Du hast doch eine Lösung, die Dir gefällt. Dann bleib bei der und bau es einfach nach. So dies nur in Deinem lokalen Netz ist ist die Chance groß, dass dir das nicht auf die "Füße fällt". Aber so findest Du den Einstieg in Java ja vielleicht einfacher und dann kannst Du - sobald Du eine erste Version laufen hast - diese ja nach und nach verändern. Ich sehe das relativ unkritisch (und in einem der ersten Threads hatte ich Dir sowas sogar explizit empfohlen wenn ich mich recht erinnere ...)
 
Standardmäßig geht außer Polling erstmal nix. Es gibt DBs, deren Java-Treiber Datenbankevents unterstützen, z. B. PostgreSQL, Oracle und H2, wobei nicht gesagt ist, dass sich damit alles realisieren lässt, was man sich so vorstellt. Für MySQL gibt es einen anderen Ansatz, der auf dem binary log von MySQL aufsetzt. Hier ist ein Artikel dazu https://pusher.com/tutorials/realtime-mysql-java
 

Zurück
Oben