Daten synchronisieren in Multi-Client-Anwendungen (Hibernate)

javabar

Mitglied
Hallo!

Ich entwickle gerade eine DB-Anwendung, bei der es mehrere Clients auf verschiedenen Rechnern geben soll, die alle auf die gleiche Datenbank zugreifen.

Man kann - was ja Standard ist - sowohl Daten ändern als auch in einer Übersicht anzeigen.

Wenn jemand einen Datensatz ändert, z.B. eine Aufgabe als erledigt markieren, sind die Informationen auf den anderen Clients nicht mehr aktuell...

Alle n Sekunden eine neue SQL-Abfrage an die Datenbank zu senden, wäre die einfachste, aber in Sachen Performance die uneleganteste Lösung.

Gibt es gute Praktiken oder fertige Lösungen, um Clients zu verständigen, wenn die Daten/Ansichten nicht mehr aktuell sind?

Viele Grüße

Egon Schmid
 

Nightmares

Aktives Mitglied
Du könntest serverseitig eine "Liste" anlegen, in derer du speicherst was gerade jemand mit seinem Client offen hat. Wenn Änderungen vorgenommen werden musst du dann dem Client eine Nachricht schicken. Das ganze setzt dann aber vorraus, dass die Clients sich nicht direkt mit der Datenbank verbinden sondern mit einer Java Anwendung auf dem Server und nur dieser hat dann eine Verbindung zur Datenbank. Alle Daten die von den Clients geschrieben oder gelesen werden gehen dann durch den Server.
 

oopexpert

Mitglied
Jede Konfliktdomäne sollte ein Versionsnummer bekommen. Das Polling schickt dann nur die Versionsnummern der Konfliktdomäne und den Zeitstempel des letzten Serverkontakts als Anfrage zum Server. Es werden dann vom Server nur Änderungsinformationen zum Client geschickt.

Direktes Informieren anderer Clients ist zwar möglich, kollidiert aber eventuell mit Isolationswünschen der Anwender, im schlimmsten Fall sogar mit parallel geänderten Daten der Konfliktdomäne. Andere Clients möchten wahrscheinlich ersteinmal ihre eigenen Änderungen machen und ggf. einen Merge vollziehen. Dies ist ein Randthema des Optimistisches Sperrverfahrens, wie man es z.B. von SVN oder CVS kennt.

Du kannst auch pessimistisch Sperren, sodass andere nur lesenden Zugriff haben zum Zeitpunkt der Änderung durch einen Client.

Das Pollen kann auch durch bidirektionales asynchrones Messaging realisiert werden. So oder so: Du kommst nicht um das Isolationsproblem herum.
 
Zuletzt bearbeitet:
D

DerMitDenDaten

Gast
Hallo

Ich habe ein ähnliches Problem wie javabar. Ich habe mehrere Clients die auf die gleiche Datenbank zugreifen. Es handelt sich um ein kleines Shopverwaltungssystem. Was passiert nun wenn diese Programme gleichzeitig eine Änderung in die DB schreiben wollen? Also z.b. wird von einem Client die Adresse von Kunde X geändert und vom anderen Client wird die Telefonnummer vom gleichen Kunden geändert. Dann ist doch nachher nur eine der Änderungen drinnen oder? Also entweder die neue Telefonnummer oder die neue Adresse. Sehe ich das richtig?
Das lässt sich wahrscheinlich so wie von Nightmares beschrieben lösen, indem alles erst über einen Server läuft der die Zugriffe verwaltet. Allerdings ist mir das ehrlich gesagt viel zu viel Aufwand und es fehlt mir wahrscheinlich auch die Erfahrung (programmiere erst seit 1 Jahr Java). Es wäre auch ok wenn immer nur einer im Shop auf einen Datensatz zugreifen kann und die anderen benachrichtigt werden das sie erst warten sollen bis der eine fertig ist. Da es nur 4 Clients gibt die auf nebeneinander stehenden PCs laufen von denen eh nie alle belegt sind wäre das vertretbar. Kann man das irgendwie lösen, ohne dass ich einen Server dazwischen schalten muss?
 

oopexpert

Mitglied
Die Zugriffe müssen grundsätzlich über einen Server verwaltet werden, denn nur er hat Meta-Wissen über potentielle Konfliktsituationen in Multi-User-Umgebungen.

Die Frage ist, reicht für die nicht-funktionalen Anforderungen eine 2-Schicht-Architektur oder muss es noch ein Applikationsserver sein. Auch mit einer 2-Schichtarchitektur ist es möglich solche Konfliktsituationen zu behandeln.

Es sind viele Möglichkeiten denkbar, welche auch teilweise vom DB-System abhängen (hier ORACLE). Hier nur einige:

1. Client mit DB-Server und Zugriffschicht mit PL/SQL.
2. Client mit DB-Server und explizitem Locking (select for update, lock table for exclusive mode)
3. Client mit DB-Server und implizitem Locking (Unique constraints)
 
D

DerMitDenDaten

Gast
Was ist wenn ich zum Kunden einen Timestamp speichere wann er zuletzt geändert wurde. Dann bevor ich ihn in der Datenbank editiere lese ich den Timestamp aus und vergleiche ihn mit dem Timestamp den ich vom letzten Auslesen der Kundendaten habe. Ist er gleich hat kein anderer Client etwas verändert und ich kann meine Daten schreiben. Ist er nicht gleich hat jemand etwas verändert und ich muss die aktuellen Daten erst mal auslesen, diese mit meinen Änderungen mergen und erst dann schreibe ich in die Datenbank. Dann muss der User zwar die Änderungen erneut machen, aber da ich davon ausgehe dass diese Situation ganz ganz selten auftritt (beim jetzigen system wurde immer unsynchronisiert auf die db zugegriffen und es gab nie probleme) wäre das verschmerzbar. Wenn ich die Schritte Timestamp lesen - Timestamp prüfen - Daten schreiben atomar mache (JDBC Transaction) müsste es doch auch ohne Server funktionieren, oder?
 

oopexpert

Mitglied
...müsste es doch auch ohne Server funktionieren, oder?
Ohne Server gehts nicht. Auch ein DB-Server ist ein Server.

Wenn ich die Schritte Timestamp lesen - Timestamp prüfen - Daten schreiben atomar mache (JDBC Transaction) müsste es doch auch ohne Server funktionieren, oder?
Vom Prinzip ja. "Timestamp lesen" müsste dabei ein select for update sein. Es ist sozusagen deine Eintrittskarte in die Konfliktdomäne. Andere Transaktionen werden dann daran gehindert, auch ein select for update durchzuführen. Für die anderen Transaktionen ist je nach Konfiguration "Warten" oder "Abbruch" angesagt. ("select for update", oder "select for update nowait")
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Alte Daten ins neue Modell quetschen Datenbankprogrammierung 6
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
R Mongodb Daten in einem bestimmten Document speichern Datenbankprogrammierung 1
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
B Daten HSQL-DB Datenbankprogrammierung 2
V H2 ManyToMany wie speichere ich die Daten? Datenbankprogrammierung 10
thobren Projekt SQlite! Wie kann ich auf auf SQlite Daten zugreifen? Datenbankprogrammierung 4
OnDemand Daten verschlüsseln Datenbankprogrammierung 42
L Oracle Daten in Häppchen selektieren Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Z Ausgabe nur bestimmter Daten Datenbankprogrammierung 6
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Kirby.exe Vorschläge zur Verschlüsselung von Daten in der DB Datenbankprogrammierung 2
T Java Spiel Daten speichern Datenbankprogrammierung 1
LimDul H2 Embedded DB und Gigabytes an Daten Datenbankprogrammierung 0
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
R Wie mit zu viele Daten umgehen? Datenbankprogrammierung 2
F MySQL Wie speichere ich Daten zeitlich abhängig? Datenbankprogrammierung 4
T Oracle Normalisierung und Daten splitten Datenbankprogrammierung 1
JG12111989 DB-Daten werden falsch dargestellt Datenbankprogrammierung 7
K H2 Daten in die H2 console DB eintragen Datenbankprogrammierung 2
L SQLite Ändern der Daten in einem UNIQUE Feld Datenbankprogrammierung 1
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
L Oracle Daten von einem Server zum andere kopieren Datenbankprogrammierung 24
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
L MySQL Vergleichen von Array-Inhalt, Ausgabe gleicher Daten Datenbankprogrammierung 3
W Daten in Java intern abfragen Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
I MySQL Datenbankstruktur angleichen - Daten behalten Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
O mit Multi-Thread Daten aus Datenbank lesen und schreiben Datenbankprogrammierung 22
F Daten verdichten Datenbankprogrammierung 0
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
B Daten aus DB in Word Dokument Datenbankprogrammierung 2
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
D Daten posten auf RestApi (Mongodb/NoSQL) Datenbankprogrammierung 0
I Fehler bei Ausgabe der Daten aus der DB Datenbankprogrammierung 3
OnDemand MySQL Daten aktualisieren Datenbankprogrammierung 6
D Daten von einem Server in eigenem Java-Programm benutzen Datenbankprogrammierung 6
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
S Daten aus Form in Datenbank nur einmal eintragen Datenbankprogrammierung 2
6 JBDC Daten verschlüsseln? Datenbankprogrammierung 2
F MySQL Daten ändern über Java Datenbankprogrammierung 3
G SQLite Daten aus SQLite DB in andere SQLite DB importieren Datenbankprogrammierung 4
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
M Daten nachträglich hinzufügen Datenbankprogrammierung 6
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
N HSQLDB Daten Auslesen Datenbankprogrammierung 3
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
P MySql daten in leeren jtable übertragen Datenbankprogrammierung 5
SexyPenny90 SQL Daten sortieren und top 5 ausgeben Datenbankprogrammierung 7
L Hibernat will Daten nicht einfügen??? Datenbankprogrammierung 2
B MySQL DB Daten aktualisieren Datenbankprogrammierung 9
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
S JPA: DB Schema ändern und Daten nicht verlieren - wie? Datenbankprogrammierung 5
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
F Daten in die DB hinzufügen Datenbankprogrammierung 7
H Klasse welche Mysql Daten zurück gibt Datenbankprogrammierung 18
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
H Daten in/aus Datenbank schreiben Datenbankprogrammierung 2
M DropDownBoxen mit MySQL Daten füllen Datenbankprogrammierung 3
E MySQL Daten in die Datenbank eingeben via Java Programm Datenbankprogrammierung 3
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
B Daten aus Datenbank holen Datenbankprogrammierung 6
T Problem beim schreiben von daten Datenbankprogrammierung 4
N Daten aus Datenbank abfragen und anzeigen in der Praxis?? Datenbankprogrammierung 2
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
G Daten aggregieren Datenbankprogrammierung 11
Gossi Oracle 2 Daten (Datum) vergleichen Datenbankprogrammierung 6
W MySQL Daten aus bestimmter Spalte lesen Datenbankprogrammierung 2
E MySQL Befüllen einer MySQL DB mit großen Daten Datenbankprogrammierung 6
J Doppelte Daten in Spalte, nur die erste abrufen wie? Datenbankprogrammierung 15
P Daten aus MySql Datenbank lesen??? Datenbankprogrammierung 6
J Daten vergleichen Datenbankprogrammierung 10
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
X Daten einer DatenbankTabelle in JTable darstellen Datenbankprogrammierung 13
T Designfrage: DB-Daten direkt oder verzögert speichern Datenbankprogrammierung 2
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
A Daten von Webshop einlesen Datenbankprogrammierung 5
S Daten aus jTextfiled in DB schreiben - SQL Befehl Datenbankprogrammierung 2
T Daten aus DB in variable Zahl an Variablen speichern Datenbankprogrammierung 18
A Datenbankanbindung an mySQL und Ein-/Auslesen der Daten Datenbankprogrammierung 4
D Vector mit Daten aus der Datenbank füllen Datenbankprogrammierung 7
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
D Keine Ausgabe der Daten Datenbankprogrammierung 3
G Daten schneller aus einer DB auslesen Datenbankprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben