2017-09-04 4 views
3

Ich habe versucht, die folgenden SchritteArangoDB Concurrency Problem

1.Using gatlin und arango Java-Treiber ich eine Sammlung mit gleichzeitiger Benutzer versucht, zu schaffen.

2.Ich erhalte doppelte Namensfehler, da mehrere Threads versuchen, die Sammlung gleichzeitig zu erstellen.

Gibt es in arango einen Mechanismussystemmechanismus, der die Erstellung einer Sammlung für einen einzelnen Thread ermöglicht und die anderen Threads während dieses Prozesses sperrt.

Antwort

2

Das parallele Erstellen von Sammlungen mit möglicherweise gleichen Namen kann tatsächlich zu doppelten Namensfehlern führen.

Im Gegensatz zum Einfügen, Entfernen, Aktualisieren und Abfragen von Dokumenten kann das Erstellen, Löschen und Umbenennen von Sammlungen nicht Teil einer ArangoDB-Transaktion sein.

So wird es einige Rassen geben, wenn Sammlungen parallel erstellt werden, und der einzige richtige Weg, sie im Moment zu behandeln, ist, den Rückkehrcode der Sammlungserstellungsantworten zu überprüfen. In den Antworten wird deutlich angezeigt, ob die Erstellung der Sammlung erfolgreich war oder ob es sich um einen doppelten Namensfehler handelt. Die Anwendung kann den Fehler dann entsprechend behandeln, indem sie entweder abbricht oder einen anderen Namen auswählt.

0

Das Problem besteht darin, dass Sie mehrere Datenbankanforderungen (wie das Erstellen einer Sammlung) aus verschiedenen Threads ausführen. ArangoDB weiß nichts über Ihre Client-Threads. Sie sind nur andere Clients für die Datenbank. Die Datenbanktransaktion wird Ihnen nicht helfen. Sie würden immer noch Ausnahmen bekommen.

Der einfachste Weg, um Ihr Problem zu vermeiden, ist die Verwendung einer synchronized Methode in Ihren Threads zum Erstellen der Sammlung. In dieser Methode prüfen Sie, ob die Sammlung bereits existiert, bevor Sie sie erstellen.

Synchronisierte Methoden können jeweils nur in einem Thread ausgeführt werden. Andere Threads, die es aufrufen, werden blockiert. Der erste Thread, der Ihre Methode aufruft, erstellt die Sammlung, die folgenden Threads werden nicht versuchen, sie zu erstellen.

public synchronized void createCollection(ArangoDatabase database, String collection) { 
    if (!database.getCollections().stream().map(c -> c.getName()).anyMatch(c -> c.equals(collection)) { 
    database.createCollection(collection); 
    } 
} 
0

es Feste mit Try-Catch in der Sammlung erstellen method.If die Schaffung Sammlung ArangoDB Exception fehlschlägt ist thrown.Then im Kontroll catch-Block für die Sammlung wieder und zurück, dass.

Verwandte Themen