Benachrichtigung wenn sich Datenbank ändert

Status
Nicht offen für weitere Antworten.

Saxony

Top Contributor
Hallo,

ich lese mit meinem Java-Programm die MSSQL Datenbank einer anderen Anwendung aus.
Wie bekomme ich nun in meinem Programm aber mit, dass sich nach dem ersten Lesen etwas in der Datenbank geändert hat.

Ich möchte dafür nicht extra einen Thread laufen lassen, welcher permanent nach Änderungen sucht, dafür müsste es doch etwas eleganteres geben. Zum Beispiel, dass die DB sich bei meinem Programm meldet und mitteilt es hat sich was geändert.


vielen Dank
Saxony
 

KSG9|sebastian

Top Contributor
Geht nicht. Die Datenbank ist grundsätzlich mal "doof" und gibt dir nur was du von ihr forderst. Listener oder ähnliches gibts nicht. Du könntest die DB vielleicht so "mißhandeln" dass du bei jedem Insert, Update oder Delete ne SP aufrufst welche in ner separaten Tabelle ein flag ändert. Aber dann kommst du trotzdem nicht drum rum diese Tabelle ständig abzufragen.
 

L-ectron-X

Gesperrter Benutzer
Schreib dir einen Server, der vor der Datenbank liegt und alle DB-Manipulationen macht. Dieser kann sich dann auch beim Client melden, wenn es Neues gibt.
 

AlArenal

Top Contributor
L-ectron-X hat gesagt.:
Schreib dir einen Server, der vor der Datenbank liegt und alle DB-Manipulationen macht. Dieser kann sich dann auch beim Client melden, wenn es Neues gibt.

Was das Problem ja lediglich in eine andere Schicht verlagert und nicht direkt löst.

Je nach DB hat man die Möglichkeit über Trigger Tabellen zu überwachen und beispielsweise in einer separaten Status-Tabelle entsprechende Flags zu setzen. Oder man setzt in allen Tabellen Timestamps und überprüft periodosch den neuesten Timestamp in der DB auf Gleichheit mit dem letzten eingeleesenen Stand in der Anwendung, oder oder oder...

Zumindest bei Veränderung der Daten gilt es zuvor deren Gültigkeit zu überprüfen, ggf. Locks zu setzen, ...
 

abollm

Top Contributor
Saxony hat gesagt.:
[..]
ich lese mit meinem Java-Programm die MSSQL Datenbank einer anderen Anwendung aus.
Wie bekomme ich nun in meinem Programm aber mit, dass sich nach dem ersten Lesen etwas in der Datenbank geändert hat.

Ich möchte dafür nicht extra einen Thread laufen lassen, welcher permanent nach Änderungen sucht, dafür müsste es doch etwas eleganteres geben. Zum Beispiel, dass die DB sich bei meinem Programm meldet und mitteilt es hat sich was geändert.
[..]

Ich bin mir nicht sicher, ob ich dich richtig verstehe. Grundsätzlich kannst du jedes _professionelle_ RDBMS so programmieren, dass du bestimmte Änderungen (INSERT, UPDATE, DELETE) 1. erkennen und 2. darauf in geeigneter Weise reagieren kannst. Diese Dinge werden üblicherweise so realisiert, dass du mit einem geeigneten Trigger (z.B. INSERT-Trigger) auf das betreffende Ereignis entsprechend reagierst. Günstig ist in einem derartigen Fall, sich eine so genannte SP (Stored Procedure) zu schreiben, die die gewünschten Aktionen auf ein INSERT, UPDATE oder DELETE direkt in der DB-Engine ausführt.

Leider kenne ich mich mit dem MS SQL-Server zu wenig aus, dass ich dir konkretere Hinweise geben kann. Trigger sind aber möglich und SPs auch. Allerdings sind die Trigger-Möglichkeiten bei weitem nicht so umfangreich und vielfältig wie bei dem Oracle-RDBMS.

Grundsätzlich und damit auch weitestgehend unabhängig vom verwendeten RDBMS kann man das Problem auch mit einer ganz anderen Technik versuchen zu lösen. Stichworte hierzu: J2EE, JMS etc. Das wäre aber hier im Forum nur sehr bedingt richtig aufgehoben.
 
C

culllmann

Gast
Servus abollm

Das würd mich aber auch intresieren wie man das mit J2EE lösen kann. Das mit den Trigger is klar, nur wie man das dann mit J2EE oder JMS lösen kann verstehe ich net.

Könntest du mir vielleicht ein paar nähre informationen geben. Wäre dir sehr dankbar.

Cullmann
 

abollm

Top Contributor
Hi cullmann,

mache ich gerne, aber nicht jetzt, weil ich dazu weiter ausholen muss. Vermutlich am späten Abend heute. Ich bin den Tag über unterwegs.

Gruß
 

Saxony

Top Contributor
Hallo,

Trigger und Stored Procedures sind ja alles schöne Dinge, leider reichen diese nicht für meinen Zweck aus.
Mein Programm muss ja wissen wenn sich was ändert, um zum Beispiel Inhalte in Tabllen aktuell zu halten.
Ichj habe das jetzt mal mit einem Trigger der auf INSERT, UPDATE und DELETE horcht, gemacht. Dieser Trigger setzt dann in ein Temp Table ein Falg, welches ich in einem Thread abfrage.
Dabei gefallen mir aber immer noch drei Dinge nicht:

1. Habe ich es nur geschafft, dass mein Trigger auf eine Tabelle aufpasst. Ich möchte aber, dass dieser auf ein komplettes Schema aufpasst, unter Annahme, dass ich die einzelnen Tabellennamen nicht weiß.

2. Werde ich im produktiven Einsatz nicht die Möglichkeit haben Relationen zu erstellen, d.h. die Sache mit Temp Table und Flag setzen fällt raus.

3. Habe ich einen Thread der permanent nach Änderungen sucht = inakzeptabel.

Gibt es nicht sowas wie bei RS232 oder Sockets wo ich ohne Polling arbeiten kann?
Obwohl hierbei eigentlich auch wieder ein Thread entsteht der am Port lauschen muss.
Aber das ist auf jeden Fall besser, dass mein Thread an einem Port auf Benachrichtigung wartet als permanent irgendwelche SELECTs zu generieren.

Kann ich mit Stored Procedures eigentlich Daten an einen Port schicken?

Eigentlich ist es schon komisch, dass es so etwas nicht gibt. Ich bin doch bestimmt nicht der erste der informiert werden will, wenn sich etwas in der Datenbank ändert.

bye
Saxony
 

AlArenal

Top Contributor
Kurz und knapp: Nein!

Eine Datenbank wird dich genausowenig über irgendwas benachrichtigen wie auch ein Webserver dich nicht anrufen wird, wenn jemand ne neue Seite hochgeladen hat. Beides sind Client-Server-Systeme und ein Server reagiert nunmal nur auf Anfragen. Eine RDBMS ist kein Blackberry.

Entweder du baust dir eine von Electronics vorgeschlagene Zwischenschicht, oder du hast eben Pech gehabt. Wo dein Problem liegt eine Überwachungsthread zu bauen, verstehe ich nicht ganz. Lass den Client alle x Sekunden nachhaken, ob sich in der DB was getan hat und überprüfe deine Datensätze vor Schreiboperationen entsprechend auf Gültigkeit und gut iss.
 

DocRandom

Top Contributor
AlArenal hat gesagt.:
Kurz und knapp: Nein!
..eher Jein! ;)

AlArenal hat gesagt.:
Eine Datenbank wird dich genausowenig über irgendwas benachrichtigen wie auch ein Webserver dich nicht anrufen wird, wenn jemand ne neue Seite hochgeladen hat. Beides sind Client-Server-Systeme und ein Server reagiert nunmal nur auf Anfragen. Eine RDBMS ist kein Blackberry.
Stimme ich Dir im Grundprinzip zu.
Es gibt aber auch RDBMS wo ich per Trigger Events weiiterleiten kann.
MSSQL bietet z.B. die Möglichkeit per Mail weiter zu leiten
PostgresSQL hat sogar Messaging per Sockets im Programm und wird z.B. von mir genutzt, da ich damit meine Faximiles an den Asterisk - Server weiterleite.
Was ORACLE, etc. kann, weiß ich ned, da ich mit diesen Systemen kaum vertraut bin
AlArenal hat gesagt.:
Entweder du baust dir eine von Elektron vorgeschlagene Zwischenschicht...
Ist ohnehin der gängige Weg bei profesionellen Systemen

lg
DocRandom
 

KSG9|sebastian

Top Contributor
Ich versteh schon den Problem, aber denk mal weiter was für einen Listener notwendig wäre den du gerne hättest. Das geht weit über eine Datenbank hinaus. Wie schon geschrieben, die Datenbank bzw. das DBMS gibt dir die Daten die du anforderst. Was du willst ist schon fast eine Kommunikation über verschiedene Schichten, und das von der Datenbank aus. Übertrieben gesagt würdest du teilweise die Datenbank vom Programm/Server abhängig machen, jenachdem was du für Listener willst.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Was genau muss ich bei date eingeben, wenn ich in Java eine Spalte definiere, die date ist? Datenbankprogrammierung 1
berserkerdq2 Was kann passieren, wenn ich in java einstelle, dass der Fremdschüssel ein Attribut ist, welches selber kein Primärschlüssel ist? Datenbankprogrammierung 4
B Distanz berechnen, wenn ich Longitude und Latidute habe? Datenbankprogrammierung 16
Kirby.exe Zeile aus der Datenbank holen wenn ein match besteht Datenbankprogrammierung 7
F Tabellen automatisch erstellen wenn sie nicht existieren Datenbankprogrammierung 6
X MySQL In MySQL Funktionen erstellen, wenn Zelle leer dann andere Zelle ändern? Datenbankprogrammierung 9
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
Kandum MySQL Anzahl gefundener Datensätze bleibt gleich, auch wenn mehr existieren und ausgegeben werden Datenbankprogrammierung 3
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
H Derby/JavaDB SQLException wenn die Datenbank in eine Jar gepackt wurde. Datenbankprogrammierung 6
W MySQL Rückgabewert wenn Wert nicht in DA Datenbankprogrammierung 7
S Hibernate - Abgeleitete Klassen werden nicht angezeigt wenn... Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
P HELP! Tabelle sortieren wenn man auf Spaltennamen klickt SQL Datenbankprogrammierung 2
J kompilierung klappt nur wenn main vorhanden ist Datenbankprogrammierung 11
C SQLException wenn String auf VARCHAR geschrieben wird Datenbankprogrammierung 10
A Was passiert wenn eine Datenbankverbindung unterbricht Datenbankprogrammierung 7
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
A MySQL Parallel laufende EntityManager kommen sich in die Quere Datenbankprogrammierung 1
X Lohnt sich sqllite? Datenbankprogrammierung 5
DStrohma Kann sich jemand mal diese DB-Struktur ansehen? Datenbankprogrammierung 2
M Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen Datenbankprogrammierung 2
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
A SQL-Befehle lassen sich nicht ausführen Datenbankprogrammierung 6
F [DB4O] Objekte sollen sich nicht verändern Datenbankprogrammierung 5
D MySQL Client - Server: Client verabschiedet sich sobald ich Variablen im SQL Statement verwende Datenbankprogrammierung 9
N Trennt sich die Verbindung zur DB (MySQL) automatisch? Datenbankprogrammierung 3
M Mysql hängt sich auf Datenbankprogrammierung 15
T MySQL: Join auf sich selbst schlägt fehlt Datenbankprogrammierung 3
V Welche Datenbank eignet sich? Pflegeaufwand? Datenbankprogrammierung 4
G Zahlen sich stored Procedures wirklich aus? Datenbankprogrammierung 12
G SQLException: Lässt sich der Fehler feststellen? Datenbankprogrammierung 10
G Wie fragt man Bilder ab die sich in einer DB befinden?? Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben