Synchronisieren von DB-Zugriffen ?

Hallo,

Hab ein größeres Problem und mich würde mal die Meinung der Experten interessieren:wink:

Habe mindestens zwei Threads die Daten aus einer DB lesen, diese verarbeiten und wieder zurückschreiben. Nur weiss ich nicht wie ich das programmieren soll:

DB-Struktur (hier mal gleich als Bean Abstrahiert:wink:
long id;
String content;
Date lastupdate;

Die Daten werden aus der DB glesen und zwar nach „lastupdate“, das einem gewissen kriterium entsprechen muss (z.B. maximal 20 Tage nicht geupdated). Da mit einer größeren ANzahl zu rechnen ist, wird das nochmals limitiert (in MYSQL gibts dazu einen SQL-Befehl LIMIT). Jetzt bekomme ich z.B. 100 der letzten maximal 20 Tage nicht geupdateden Datensatze zurück.

Die Threads bearbeiten diese 100 Datensätze die ich in einem Array/List vorhalte und speichern die bearbeiteten Datensätze auch erstmal wieder in einem Array/List, um sie dann wieder auf einen Schlag in die DB zurückzuschreiben. Sprich ich speichere sowohl die aus der DB glesenen DAten in meinem „Array/List-Cache“ als auch die bearbeiteten DAten, bevor sie dann wieder mit einer Operation in die DB zurückgeschrieben werden.

Das Problem dabei ist nun aber, dass ich beim Auslesen von Daten aus der DB diese ja nicht in der DB flaggen kann, dass diese gerade bearbeitet werden. Nachdem sich immer irgendwie Daten in meinem „Zurückschreibn-Cache“ befinden, die noch nicht zurückgeschrieben wurden , besteht nun die Gefahr, dass ich Daten aus der DB lese, die bereits in Bearbeitung sind, aber eben noch nicht zurückgeschrieben wurden (zurückschreiben bedeutet ja automatisch auch das lastupdate-Kriterium neu zu setzten, so dass sie bei einer gleichen Abfrage wieder aus dem Raster fallen).

Das einzige was mir dazu einfällt ist eben irgendwo „zentral“ in Java zu checken, welche DAten noch nicht zurückgeschreiben wurden und diese dann bei einer SQL Abfrage rauszufilter. Was hier ja anhand der ID gut gehen würde. WHERE KRITERIUM=True AND ID NOT IN [1,2,54,5,6]. (hab den SQL Befhel jetzt nicht auswendig und hoffe der stimmt so) Allerdings wird das ja auch äußerst kritisch wenn es sich da um 1000nde von IDs handeln sollte.

Meine Frage ist, kennt Ihr da irgendwelche „einfachen“ Design Patterns oder anderen Ansätze wie man sowas lößt, (Datensätze multithraded auslesen, bearbeiten und __zurückschreiben__?? (nur Auslesen ist realtiv trival, das Problem ist das mit dem Zurückschreiben, dass das mit dem Auslesen nicht in Konflikt gerät)

Vielen DAnk
Julian

Moin

Habe mindestens zwei Threads die Daten aus einer DB lesen,
diese verarbeiten und wieder zurückschreiben. Nur weiss ich
nicht wie ich das programmieren soll:

Man hat so Möglichkeiten:

Auf java-seite: implementier eine Art Cache auf javaseite. Wenn der 2. Thread Daten abfragt die schon im Cache sind könnte man die rausfiltern. (Nachteil: der Cache muss wissen was mit den Daten passiert, Vorteil: es läuft auch schnell wenn das commit-System der DB… bescheiden ist)

Auf SQL-seite: SQL-Server können die Situationen auch auflösen indem sie dem 2. Thread das commit verweigern (Frag im SQL-Brett. Man kann die Daten „locken“ und später per commit freigeben ohne dabei anderen Threads in die Suppe zu spucken). Dann hat man zwar Daten umsonst gerechnet, aber das ist immernoch besser als falsche Daten in der SQL-DB zu haben.

cu

thanks |Re^2: Synchronisieren von DB-Zugriffen ???
hallo pumpkin,

danke für die Antwort.

viele Grüßße
Julian