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
Future<?> 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();
}
--
---
You received this message because you are subscribed to the Google Groups
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.