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
 
K

kneitzel

Gast
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).
 

nonickatall

Mitglied
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
 

Oneixee5

Top Contributor
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.
 
K

kneitzel

Gast
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 ...)
 

mihe7

Top Contributor
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S MySQl - Neue Datensätze "on the Fly" verarbeiten Datenbankprogrammierung 8
D Alte Daten ins neue Modell quetschen Datenbankprogrammierung 6
Thallius Ist JSON als column jetzt der neue Standard oder hab ich was verpasst? Datenbankprogrammierung 34
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
L0MiN Wie kann ich eine bestimmte Seite aus verschiedenen Excel-Tabellen in eine neue Exceldatei kopieren? Datenbankprogrammierung 1
J Optimierung von Querys/ ausgegebene Tabelle mit in neue Anfrage einbinden Datenbankprogrammierung 2
L Neue Zeile in DB anlegen Datenbankprogrammierung 3
P Neue Tabelle dazugekommen Datenbankprogrammierung 1
S Vordefinierte Queries aufrufen und neue speichern. Datenbankprogrammierung 5
G neue benutzer anlege in mysql Datenbankprogrammierung 3
M Datensätze in DataGrip (IntelliJ) Datenbankprogrammierung 1
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
R MySQL Datensätze in Textdokument Datenbankprogrammierung 7
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
R Große Datensätze, kleine Rechte Datenbankprogrammierung 8
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
E primaryKey auslesen - Datensätze abgleichen Datenbankprogrammierung 4
S Häufig vorkommende Datensätze Datenbankprogrammierung 4
Kandum MySQL Anzahl gefundener Datensätze bleibt gleich, auch wenn mehr existieren und ausgegeben werden Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
J Datensätze löschen Datenbankprogrammierung 6
O Löschen vieler Datensätze mit Hibernate Datenbankprogrammierung 11
C Hibernate Datensätze finden Datenbankprogrammierung 17
F [SQLite] Mehrere Datensätze einfügen Datenbankprogrammierung 12
S Anzahl Datensätze in db4o Datenbankprogrammierung 2
D Können nur angesehende Datensätze geloggt werden? Datenbankprogrammierung 4
F NUR 3 datensätze auslesen Datenbankprogrammierung 6
F MySQL Nur die Datensätze zurückgeben, in denen ein anderer Preis steht Datenbankprogrammierung 9
B Aktuellen Stand der Datensätze einer Datenbank anzeigen Datenbankprogrammierung 9
J SQL-Abfrage zur löschung doppelter Datensätze Datenbankprogrammierung 7
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J Datensätze aus der Datenbank holen Datenbankprogrammierung 3
M Keine doppelten Datensätze einfügen Datenbankprogrammierung 24
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
C Doppelte Datensätze Datenbankprogrammierung 11
T Datensätze effektiv einlesen Datenbankprogrammierung 4
ARadauer viele datensätze. Datenbankprogrammierung 3
I Anzahl unterschiedlicher Datensätze ausgeben Datenbankprogrammierung 2
D mehrere Datensätze in ein Listenfeld Datenbankprogrammierung 2
S 50.000 updates auf 50.000 Datensätze Datenbankprogrammierung 3
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
M Datensätze zählen. Datenbankprogrammierung 6
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
M JDBC: Viele Datensätze in Tabelle einfügen: Wie? Datenbankprogrammierung 7
C Datensätze variabel hinzufügen Datenbankprogrammierung 4
K Ältere Datensätze archivieren Datenbankprogrammierung 4
C Datensätze in einer JComboBox auflisten Datenbankprogrammierung 2
V Anzahl der Datensätze abfragen Datenbankprogrammierung 9
W Datensätze v. SQL-Datenbank i. JTextFields ausgeben/updaten Datenbankprogrammierung 12
D Anzahl der zurückgelieferten Datensätze Datenbankprogrammierung 2
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
D Zweckmäßigkeit einer Schlüsseltabelle Datenbankprogrammierung 4
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
J In einer bestimmten Spalte suchen mit Suchfeld (MS SQL) Datenbankprogrammierung 7
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
J Welche Kriterien haben Einfluss auf die Geschwindigkeit einer Datenbank ? Datenbankprogrammierung 4
S Anmelden an einer msql datennbank Datenbankprogrammierung 1
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
ralfb1105 Oracle Zwei ojdbc Driver in einer Applikation? Datenbankprogrammierung 13
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Speicherverbrauch Java Anwendung mit einer Datenbankanbindung Datenbankprogrammierung 19
temi Wie kann ich "Class" in einer DB speichern? Datenbankprogrammierung 2
F UPDATE - Befehl nur in einer Zeile Datenbankprogrammierung 11
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
DaCrazyJavaExpert Derby/JavaDB Wert einer Variable in der Datenbank direkt auf 1 setzten. Datenbankprogrammierung 71
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
F Java Objekte in einer Datenbank speichern Datenbankprogrammierung 4
MrSnake Hilfe bei erstellen einer DB Datenbankprogrammierung 12
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
E Warum funktioniert das Erzeugen einer View nicht? Datenbankprogrammierung 1
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
E Wie geschieht der konzeptueller Entwurf einer Datenbank Datenbankprogrammierung 1
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
D HSQLDB INSERT INTO in einer For Schleife mit selber ID, machbar? Alternative? Datenbankprogrammierung 7
I Inhalt einer hsqldb anzeigen Datenbankprogrammierung 1
J Realisierung einer DB in Combi mit Java Datenbankprogrammierung 13
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
S Auswahl einer Datenbank Datenbankprogrammierung 0
M Derby/JavaDB Speicherplatz einer Zeile bestimmen Datenbankprogrammierung 0
P JPA in einer größeren Java SE Anwendung Datenbankprogrammierung 0
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben