1

Mit einer Menge von Daten zu verarbeiten Ich habe versucht, sie parallel zu machen.Datenbank Multithreading mit beibehaltenen Sequenz-Updates auf Primärschlüssel

Aber das Problem, das auftritt, war, dass in einem Testfall habe ich erste 6 Aufgaben zum gleichen Primärschlüssel. Die Reihenfolge der Aufgaben mit demselben Primärschlüssel (ID) ist wichtig und darf nicht geändert werden. Derzeit habe ich keine Garantie dafür.

Beispiel:

items = [{id: 1, data: "a"}, {id: 1, data: "b"}, {id: 2, data: "g"}] 

Ich weiß, muss dass awar vorb, und alle Aufgaben im Threadpool ausgeführt garantiert nicht, dass. Es besteht die Möglichkeit, dass ab überschreibt.

Gibt es ein gutes Designmuster, um dieses Problem zu lösen?

+0

gefunden werden, da nichts in diesem Code gibt es das, was „die Reihenfolge der Aufgaben mit dem gleichen Primärschlüssel“ * zeigt * bedeutet eigentlich. –

+0

Ich habe meine Frage verbessert. Ich hoffe, es ist jetzt in Ordnung. –

Antwort

1

Ein gutes Entwurfsmuster für diesen Anwendungsfall besteht darin, für jede ID eine separate Actor-Instanz zu verwenden. Elemente werden an den entsprechenden Aktor gesendet und in der Eingabewarteschlange in der richtigen Reihenfolge gehalten. Actor übernimmt die nächsten Elemente aus der Warteschlange und speichert sie in der Datenbank. Um einen Akteur für den Schlüssel zu finden, kann eine HashMap verwendet werden.

Wenn es zu viele verschiedene IDs und zu viele Aktoren gibt, kann der Aktor überprüfen, ob sich die Registrierung der HashMap abmeldet, wenn die Eingabewarteschlange für einige Zeit leer ist.

Auch ein solcher Aktor kann optimiert werden, so dass anstelle der Eingabewarteschlange eine Variable für ein einzelnes Element verwendet werden kann. Wenn ein anderer Artikel eintrifft, wenn der vorherige Artikel noch nicht in der Datenbank gespeichert ist, wird der neue Artikel einfach über den vorherigen Artikel geschrieben - das Schreiben des alten Artikels hat sowieso keinen Sinn, er wird in der Datenbank überschrieben.

Ein einfacher Schauspieler zu beginnen Es ist nicht klar, was Sie fragen, bei https://github.com/rfqu/CodeSamples/blob/master/src/simpleactor/SimpleActor.java

+0

Ich habe meine Frage vereinfacht, weil ich es nicht zu kompliziert machen wollte, aber ich muss jeden Eintrag ID DB gespeichert haben, auch wenn er überschrieben wird. Danke für deine Antwort, ich werde mehr darüber lesen. –

Verwandte Themen