I would like to use Graph Elements (not just the graph) across threads. I understand what is necessary to use the Graph across threads but want to know if an already retrieved Element (and iterator) can also be used across threads (safely) in a similar manner (simply by calling graph.makeActive() before using the graph in each thread).
The following code works as expected. It uses 2 threads. Everything works as expected as the reused graph is only used from one thread at a time (not concurrent). This type of behavior is necessary in order to pass state from thread to thread. Otherwise, I'd have to retrieve the vertices in each thread (by passing ids I guess) which would be highly inefficient - especially when the results are large and can't fit in memory.
Note that the Element.getGraph() will return null on the new thread but will return the graph properly if you call OrientBaseGraph.makeActive() first.
@Test
public void testGraphAcrossThread() throws InterruptedException, ExecutionException {
//Create the graph
OrientBaseGraph g = new OrientGraphFactory("plocal:tmp/orientdb/thread").getTx();
//Create a vertex
OrientVertex oV = g.addVertex(null).setProperties("name", "Luigi");
//Query for the vertex
final Iterator<Vertex> iterator = g.getVertices("name","Luigi").iterator();
//Create a new thread and submit a runnable that uses the same Graph
Fu
ture<?> future = Executors.newSingleThreadExecutor()
.submit(new Runnable() {
@Override
public void run() {
//Element's graph will be null on this thread
Assert.assertNull(oV.getGraph());
//Make the graph active on the new thread
g.makeActive();
//Element's graph is now non-null on this thread
Assert.assertNotNull(oV.getGraph());
//Everything works as expected
Assert.assertTrue(iterator.hasNext());
Assert.assertEquals("Luigi", oV.getProperty("name"));
Assert.assertEquals("Luigi", (String)iterator.next().getProperty("name"));
oV.setProperty("age", "20");
}
});
//Call get on the future so that the thread's work completes before using the graph on this thread
future.get();
//Graph is not null like it was on a new thread
Assert.assertNotNull(oV.getGraph());
//But the everything still works as expected
Assert.assertEquals("20", oV.getProperty("age"));
Iterator<Vertex> iterator2 = g.getVertices("name","Luigi").iterator();
Assert.assertEquals("Luigi", (String)iterator2.next().getProperty("name"));
g.commit();
g.drop();
}