在多线程中使用titan图的最佳做法是什么?

时间:2016-01-24 11:30:34

标签: java titan tinkerpop3

我使用spring boot构建了一个Web服务。我使用titan graph作为跨Web服务访问的单例。因此,如果对Web服务有多个请求,Web服务器将生成线程来处理请求,并且将在这些线程中使用titan图。这种方法有什么问题吗?我使用titan graph 1.0.0和tinkerpop 3.0.1-incubating。所以titan图对我来说很新,而且我不知道在多线程中使用titan图是否有任何冲突。如果这种方法有问题,那么在多线程中使用titan图形的最佳做法是什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

是的,去吧。如果您使用的是Titan,请务必阅读multi-threaded transactions上提供的文档。

  

借助蓝图'默认事务处理,每个线程自动打开自己的事务对图数据库。要打开与线程无关的事务,请使用newTransaction()方法。   newTransaction()方法返回表示此新打开的事务的新TransactionalGraph对象。图形对象tx支持原始图形所做的所有方法,但不会为每个线程打开新事务。这允许我们启动多个线程,这些线程在同一个事务中同时工作,其中一个线程在所有线程完成工作后最终提交事务。

如果您使用的库可能跨多个线程进行单个概念事务,则可能会更安全,例如:通过使用延期或承诺。

答案 1 :(得分:2)

以这种方式使用Titan是完全可以接受的。您只需要确保交易不会在请求之间泄漏。根据TinkerPop语义,Graph实例上的事务绑定到当前线程。因此,每个HTTP请求的结束都需要使用commit()rollback()关闭事务,具体取决于请求的成功或失败。如果您甚至不确定是否有能力始终关闭交易,那么您应该考虑在请求开始时发出rollback()以清除之前的状态。