泰坦的多线程引发异常

时间:2015-10-15 05:34:14

标签: java titan

我在Titan中创建了一个具有多个线程的顶点。 这是我的代码

尝试连接到Titan,指定架构,然后添加顶点。

g = TitanFactory.open("/conf/titan-cassandra.properties");
TitanManagement mgmt = g.getManagementSystem();
final PropertyKey userid = mgmt.makePropertyKey("userid").dataType(Integer.class).make();
TitanGraphIndex namei = mgmt.buildIndex("userid",Vertex.class).addKey(userid).unique().buildCompositeIndex();
mgmt.setConsistency(namei, ConsistencyModifier.LOCK);
mgmt.commit();

然后我调用了一个添加顶点的函数

多个线程访问函数Add Vertex,它接受输入参数 - 随机生成的唯一数字(entityPK)

tx1 = g.newTransaction();
Vertex user_ver = tx1.addVertexWithLabel("user");
user_ver.setProperty("userid",entityPK);
//Adding other properties for vertex
tx1.commit();`

我读到引发的异常是因为没有指定LOCK。但即使在指定LOCK之后,也会抛出异常。

com.thinkaurelius.titan.core.TitanException:由于持久性异常而无法提交事务

1 个答案:

答案 0 :(得分:0)

如果这段代码:

tx1 = g.newTransaction();
Vertex user_ver = tx1.addVertexWithLabel("user");
user_ver.setProperty("userid",entityPK);
//Adding other properties for vertex
tx1.commit();

位于您的addVertex函数内,多个线程正在调用addVertex,我认为您并未正确使用newTransaction。这就产生了所谓的"线程交易"。线程事务是多个线程作用于SAME事务的事务。在您的使用中,每个线程都在创建自己的DIFFERENT事务。鉴于你所描述的内容,我会说正确的方法是让addVertex成为:

Vertex user_ver = g.addVertexWithLabel("user");
user_ver.setProperty("userid",entityPK);
//Adding other properties for vertex
g.commit();

我也会考虑放弃锁定(除非你需要它)。