2017-01-13 2 views
0

Ich versuche, mehrere Scheitel parallel zu erstellen:Wie Sequenz in Multi-Threaded-Umgebung verwenden

public static void main(String[] args) throws InterruptedException { 

    //create db and seq 
    ODatabaseDocumentTx db = new ODatabaseDocumentTx("memory:/TestDB"); 
    db.create(); 
    OSequenceLibrary seqLib = db.getMetadata().getSequenceLibrary(); 
    seqLib.createSequence("testSeq", 
     OSequence.SEQUENCE_TYPE.ORDERED, 
     new OSequence.CreateParams().setStart(0L).setIncrement(1) 
    ); 

    OrientGraphFactory factory = new OrientGraphFactory("memory:/TestDB", "admin", "admin").setupPool(1, 8); 

    //mt 
    Executor executor = Executors.newFixedThreadPool(8); 

    CountDownLatch latch = new CountDownLatch(1000); 
    for (int i = 1; i <= 1000; i++) { 
     executor.execute(() -> { 
      OrientGraph g = factory.getTx(); 
      try { 
       OSequence seq = g.getRawGraph().getMetadata().getSequenceLibrary().getSequence("testSeq"); 
       OrientVertex v = g.addVertex("TestClass"); 
       v.setProperty("seq", seq.next()); 
       latch.countDown(); 
      } finally { 
       g.shutdown(); 
      } 
     }); 
    } 
    latch.await(5, TimeUnit.SECONDS); 
    System.exit(0); 
} 

und erhält viele Ausnahmen:

com.orientechnologies.orient.core.exception. OConcurrentModificationException: UPDATE der Datensatz # 7: 0, da die Version nicht die neueste ist. Wahrscheinlich aktualisieren Sie einen alten Datensatz oder es wurde von einen anderen Benutzer (db = v2 Ihr = v1)

So verwenden Sequenz in mt Umgebung richtig verändert?

Antwort

1

OrientDB basiert vollständig auf einem optimistischen Ansatz ohne oder mit wenigen Sperren. Aus diesem Grund sollten Sie die Ausnahme abfangen und es erneut versuchen. Beispiel:

OrientGraph g = factory.getTx(); 
try { 
    for(int retry = 0; retry < 100; ++retry){ 
    try { 
     OSequence seq = g.getRawGraph().getMetadata().getSequenceLibrary().getSequence("testSeq"); 
     OrientVertex v = g.addVertex("TestClass"); 
     v.setProperty("seq", seq.next()); 
     latch.countDown(); 
     break; 

    } catch(ONeedRetryException e) { 
    } 
    } 
} finally { 
    g.shutdown(); 
} 
+0

Danke, es war nicht offensichtlich für die Sequenz. – zella