2017-01-13 4 views
0

Ich benutze Neo4J BatchInserter, um eine große Datenbank von Grund auf aufzubauen. Ich verwende mehrere Threads, um Daten aus dem BatchInserter zu lesen und Schreibvorgänge zu synchronisieren.Neo4J BatchInserter und Multithreading

Problem: Früher oder später ich in eine Exception ausgeführt werden, wenn zu versuchen, lesen Eigenschaften

  • sind mit Assertions in DirectRecordAccess.putInBatc
  • mit Assertions deaktiviert ich eine ArrayIndexOutOfBounds in PropertyRecord.next bekommen

    Ausnahme im Thread "Haupt" java.lang.ArrayIndexOutOfBoundsException: 4 bei org.neo4j.kernel.impl.store.record.PropertyRecord.next (PropertyRecord.java:190) bei org.neo4j.kernel.impl.store.record.PropertyRecord.next (PropertyRecord.java:41) bei org.neo4j.kernel.impl.transaction.state.Loaders $ 2.ensureHeavy (Loaders.java:189) bei org.neo4j.kernel.impl.transaction.state.Loaders $ 2.ensureHeavy (Loaders.java:161) bei org.neo4j.unsafe.batchinsert.DirectRecordAccess $ DirectRecordProxy.forReadingData (DirectRecordAccess.java:174) bei org .neo4j.unsafe.batchinsert.DirectRecordAccess $ DirectRecordProxy.forReadingData (DirectRecordAccess.java:115) bei org.neo4j.kernel.impl.transaction.state.PropertyTraverser.getPropertyChain (PropertyTraverser.java:65) bei org.neo4j.unsafe .batchinsert.internal.BatchInserterImpl.getPropertyChain (BatchInserterImpl.java:1000) bei org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl .getNodeProperties (BatchInserterImpl.java:900)

JavaDoc heißt es: "Nur ein Thread zu einem Zeitpunkt, an dem Batch-Inserter arbeiten kann, Zugang Ausführen mehrerer Threads gleichzeitig haben die Synchronisation zu verwenden."

Frage (n):

  • Ist BatchInserter Gewinde-Safe für Nur-Lese-Operationen?
  • Wenn dies der Fall ist, sollte es sicher sein, synchronisierte Schreibvorgänge durchzuführen, solange keiner der gleichzeitig schreibgeschützten Threads Daten anfordert, die gerade geschrieben werden?

Vielen Dank für Ihre Bewertung!

Rüdiger

Antwort

0

leid bothering- sollte ich habe es gerade getestet, wie ich jetzt. Also an alle, die sich fragen: Es scheint, dass Sie sogar Lesezugriff serialisieren müssen - oder stellen Sie sicher, dass Sie nicht versuchen, gleichzeitige Lesevorgänge der gleichen Eigenschaften zu machen.

Was ich getestet:

  • 100 Knoten erstellen BatchInserter mit einem String-Attribut jeder
  • schreiben 2 Threads versuchen, Eigenschaften von Knoten in einer Endlos-Schleife

Was heraus zu holen kam :

  • Wenn die zwei Threads Eigenschaften von verschiedenen Knoten lesen, ist alles fi ne
  • Wenn die Fäden aus dem gleichen Knoten lesen die folgende Ausnahme

    Exception in thread geworfen wird "Thread-2" java.util.NoSuchElementException bei org.neo4j.kernel.impl.store.record.PropertyRecord .next (PropertyRecord.java:187) bei org.neo4j.kernel.impl.store.record.PropertyRecord.next (PropertyRecord.java:41) bei org.neo4j.kernel.impl.transaction.state.PropertyTraverser.getPropertyChain (PropertyTraverser.java:66) bei org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl.getPropertyChain (BatchInserterImpl.java:1000) bei org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl.getNodeProperties (BatchInse rterImpl.java:900) bei org.hucompute.wikidragon.core.test.BatchInserterTest $ ReadThread.run (BatchInserterTest.java:56)

Best Wishes,

Rüdiger