Orientdb交易最佳实践

时间:2014-08-27 16:53:34

标签: orientdb

我正在使用REST API。我在Orientdb中遇到各种各样的交易问题。在当前设置中,我们有一个包装ODatabaseDocumentPool的单例。我们通过此设置检索所有实例。每个api调用都是从池中获取实例并使用ODatabaseDocumentTx实例创建OrientGraph的新实例开始的。后面的代码使用ODatabaseDocumentTx和OrientGraph中的方法。在代码的最后,我们在写操作上调用graph.commit(),在所有操作上调用graph.shutdown()。

我有一份问题清单。

  • 要验证,我仍然可以使用我用来创建OrientGraph的ODatabaseDocumentTx实例吗?或者我应该使用OrientGraph.getRawGraph()?

  • 使用OrientGraph时,执行读取操作的最佳方法是什么?即使在读取操作期间,我也会在检索记录时获得OConcurrentModificationExceptions,锁定异常或错误。这是因为OrientGraph是事务性的,即使在检索记录时也会修改版本吗?我应该提一下,我也使用索引管理器并在这些读操作中迭代顶点的边。

  • 当我通过索引管理器获取记录时,是否会更新数据库上的版本?

  • graph.shutdown()是否会将ODatabaseDocumentTx实例释放回池中?

  • v1.78是否仍然要求我们锁定交易中的记录?

  • 如果在OrientGraph上将autoStartTx设置为false,我是否必须手动启动事务,还是在访问数据库时自动启动?

示例代码:

ODatabaseDocumentTx db = pool.acquire();

//                READ

OrientGraph graph = new OrientGraph(db);

ODocument doc = (ODocument) oidentifialbe.getRecord() // I use Java API to a get record from index

if( ((String) doc.field("field")).equals('name') )
     //code

OrientVertex v = graph.getVertex(doc);

for(OrientVertex vv : v.getVertices()) {
      //code
}

//               OR WRITE

doc.field('d',val);
doc = doc.save();
OrientVertex v = v.getVertex(doc);
graph.addEdge(null, v, otherVertex);
graph.addEdge(null, v, anotherVertex) // do I have to reload the record in v?

//              End Transaction

// if write
graph.commit();

// then
graph.shutdown();

0 个答案:

没有答案