Frage

wir mit einer gewissen Regelmäßigkeit Behauptung auf einer Datenbanktabelle auftreten, und möchten für die Lösung dieses Problems eine Reihe von verschiedenen Optionen bewerten.

, um so zu tun, muß i in einem Testfall, Anstoß auf einem Tisch (jede Tabelle) mit wiederholbarer Zuverlässigkeit reproduzieren.

der Ansatz, den ich überlege ich wäre die Semantik einer Sperre aufzuheben (z java.util.concurrent.locks.ReentrantLock) und die Verriegelung zu lösen, wenn sie auf dem Tisch zu schreiben beginnt, so dass alle lesen zu der Zeit auftreten, wenn das Schreiben beginnt.

So also ein Autor Faden hält die Sperre bis kurz vor einem Einsatz in eine Tabelle zu tun, und dann Lösen die Verriegelung, würden mehrere Leser-Threads versuchen Select-Anweisungen für die Tabelle ausgeführt werden.

Frage mich, ob es irgendwelche Gedanken waren auf einen solchen Ansatz, oder wenn es einen einfacheren Ansatz, konnte mit 100% Zuverlässigkeit, reproduce Behauptung auf einer DB-Tabelle.

Dank

War es hilfreich?

Lösung

Sie könnten eine CountDownLatch mit einer Zählung von 1 verwenden.

final CountDownLatch barrier = new CountDownLatch(1);

Sie starten alle der Leser-Threads, dessen erste Aktion

barrier.await();

dann der Writer-Thread kann

barrier.countDown();

an welcher Stelle alle der Leser Feuer weg fröhlich.

Andere Tipps

Es hängt viel von Ihrer Datenbank, wie einfach es ist, Anstoß darin zu erzeugen. Zum Beispiel, wenn Sie Oracle verwenden, dann einen Auswahl tun nie wieder Streit erzeugen.

Der einfachste Weg zu produzieren Anstoß in der Datenbank ist ein für Lese auf der Zeile auswählen zu tun, dass Sie wissen, Sie sind dabei, nach Bedarf zu aktualisieren.

Bearbeiten : Nachdem die Frage erneut zu lesen, ich sehe, dass Sie scheinen mehr über „Leser“ Konflikte auf der Datenbank als Update Behauptung zu kümmern. Die obige Idee kann Kraft Update Anstoß verwendet werden, aber nicht Leser Anstoß.

Im Fall, in dem Sie eine Massenzahl von Lesern starten mögen, die Datenbank mit wählt zu überschwemmen, die keine wirkliche Konkurrenz verursachen sollten, nur Hunger, dann können Sie die CountDownLatch verwenden, wie in einer anderen Antwort erwähnt, oder es tun, um das altmodische Weise mit Object.wait / Object.notifyAll (), wenn Sie in einem Pre-1.5 JVM.

sind gezwungen, laufen

Edit 2 : Nach dem Kommentar zu lesen, wahrscheinlich der einfachste Weg, um die Behauptung zu emulieren, dass Sie sehen werden, ist die Sybase verwenden Sperrtabelle Befehl . Nur sperren die Tabelle, die Feuer auswählt und dann die Tabelle entriegeln. Die wählt sollten dann alle Feuer aus ... Das hat auch den Vorteil, die meisten, die Situation genau zu emulieren, dass Sie Modell versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top