Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen (https://www.delphipraxis.net/212015-wie-mehrere-anwendungen-bei-aenderung-einer-tabelle-benachrichtigen.html)

jus 2. Dez 2022 15:33

Datenbank: MySQL • Version: 5 • Zugriff über: libmysql.dll

Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen
 
Hallo,
ich habe eine grundsätzliche Frage und hätte eure Expertise gewußt. Ich habe eine alte Kassasoftware, die nativ über libmysql.dll direkt auf eine MySQL Datenbank zugreift. Darin gibt es eine Tabelle für Warenkorb, wo die aktuellen Artikeln im Geschäft eingescannt werden. Jetzt möchte ich weitere Instanzen von der Kassaanwendung laufen lassen, die dann mitkriegen, wenn sich der Inhalt der Tabelle ändert, sprich weitere Produkte abgelegt werden, oder gelöscht werden. Eigentlich ist das Problem ja nicht nur auf MySQL bezogen, sondern generell, gibt es von der Datenbankseite Möglichkeiten die Anwendungen zu beachrichtigen, dass sich an der Tabelle was geändert hat, oder muß die Anwendung in periodischen Zeitintervallen in der Datenbank nachschauen, ob sich die Tabelle geändert hat? Wie löst man sowas? :gruebel:

Lg,
jus

mjustin 2. Dez 2022 15:45

AW: Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen
 
MySQL unsterstützt anscheinend Notifications nicht, aber es gibt (Open Source) Implementierungen, die etwas ähnliches bereitstellen. Zum Beispiel diese:

Zitat:

The github project mysql-notification provides a MySQL user defined function MySQLNotification() as a plugin to MySQL that will send notification events via a socket interface. This project includes a sample NodeJS test server that receives the notification events that could be adapted for Java or any other socket service.
https://stackoverflow.com/questions/...ify-equivalent

https://github.com/Cyclonecode/mysql-notification

In dieser UDF wird ein HTTP Server benötigt, der alle Clients benachrichtigt.


Einige Gedanken zu diesem Thema habe ich im Artikel Firebird Database Events and Message-oriented Middleware (part 1) gesammelt.

Darin werden auch Einschränkungen (und Workarounds) beschrieben die sich aus periodischen Abfragen des Servers auf neue Einträge ergeben können.

MyRealName 5. Dez 2022 07:46

AW: Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen
 
Wenn man allerdings eine Lösung wie diese mit der UDF, die einen Server benötigt, der die Clients benachrichtigt, da kann man es auch gleich selbst in den Client einbauen. Gibt es eine Änderung, die andere benachrichtigen sollte, einfach diese vom Client anschubsen und die anderen können bestimmte Nachrichten abbonieren. Der Server Prozess entscheidet dann, welcher Client dan die Nachricht erhält.

EDIT: Da fällt mir ein, dass auch die UDF an diesen Server zusätzlich senden kann und Nachrichten durch Trigger bereit stellen kann, die vllt für den Client schwer zu evaluieren sind. Stock Low im Inventar kommt da in den Kopf, wenn man eine Rechnung speichert.

jaenicke 5. Dez 2022 08:44

AW: Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen
 
Ich fände es generell ungünstig, wenn man die Vernetzung einer Anwendung auf der Basis von Datenbanktabellen löst. Die Datenhaltung hat mit der Anwendungslogik nicht viel zu tun, wenn man das sauber trennt. Manche packen bewusst sehr viel Logik in die Datenbank, was z.B. bei Warenwirtschaften auch sinnvoll ist, aber da geht es dann um Datenlogik, nicht um die Kommunikation zwischen verschiedenen Instanzen einer Anwendung.

Selbst wenn es technisch stabil hinzubekommen sein sollte, halte ich das für keine gute Idee.

jus 6. Dez 2022 18:07

AW: Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen
 
Zitat:

Zitat von mjustin (Beitrag 1515799)
MySQL unsterstützt anscheinend Notifications nicht, aber es gibt (Open Source) Implementierungen, die etwas ähnliches bereitstellen. Zum Beispiel diese:

https://stackoverflow.com/questions/...ify-equivalent

https://github.com/Cyclonecode/mysql-notification

In dieser UDF wird ein HTTP Server benötigt, der alle Clients benachrichtigt.
.............

ah ok, das mit UDF habe ich bisher nicht gekannt. Vielen Dank für den Hinweis und die Links. Da ich in diesem Fall Zugriff auf den MySQL Server habe, werde ich es mir mal anschauen, wie weit ich da komme.

@jaenicke: vielen Dank für den Hinweis, ich gebe zu, dass ich es noch nicht von dieser Seite her daran gedacht habe, aktuell ist es eher noch so eine Machbarkeitsstudie. :mrgreen:

jus 9. Dez 2022 09:57

AW: Wie mehrere Anwendungen bei Änderung einer Tabelle benachrichtigen
 
Hallo,
wollte noch mal rückmelden, dass die MySQL UDF Sache nun läuft. Für die Leute die sowas ähnliches mal machen möchten, eine kurzes Feedback wie ichs gemacht habe:
Mein Glück ist, dass der MySQL Server auf Windows läuft ist. Darum habe ich einfach mein altes Visusal Studio 2005 angeschmissen und in C eine DLL mit einer Methode gemacht. Folgender Link war sehr hilfreich:
Creating MySQL UDFs with Microsoft Visual C++ Express
Die Methode in der DLL verschickt einfach ein UDP Broadcast über WINSOCKET an einem bestimmten Port im Netzwerk. Diese DLL ins MySQL Serververzeichnis (in meinem Fall ./BIN, bei neueren MySQL Versionen eventuell ein anderes Verzeichnis) kopiert und in SQL mit "CREATE FUNCTION..." die Methode von der DLL einbinden. Dann noch 3 Trigger für INSERT, UPDATE und DELETE in der DB gesetzt und fertig. Die Anwendungen bekommen dann immer was mit, wenn eine Änderung in der Tabelle gemacht wird.


Zitat:

Zitat von MyRealName (Beitrag 1515852)
Wenn man allerdings eine Lösung wie diese mit der UDF, die einen Server benötigt, der die Clients benachrichtigt, da kann man es auch gleich selbst in den Client einbauen. Gibt es eine Änderung, die andere benachrichtigen sollte, einfach diese vom Client anschubsen und die anderen können bestimmte Nachrichten abbonieren. ....

@MyRealName: ja, ich gebe dir recht, dass ich die Benachrichtigung über WINSOCK UDP Broadcast im Falle einer Änderung über die eigene Anwendung hätte auch machen können. Aber die Sache mit UDF hat mich hier auch irgendwie gereizt. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz