2016-01-24 24 views
3

我使用弹簧引导构建了一个Web服务。我使用titan图形作为可以跨Web服务访问的单例。因此,如果对Web服务有多个请求,Web服务器将产生线程来处理请求,并且Titan图将用于这些线程。这种方法有什么问题吗?我使用泰坦图1.0.0和tinkerpop 3.0.1孵化。所以泰坦图对我来说是相当新的,我不知道在多线程中是否有任何使用泰坦图的冲突。如果这种方法有问题,那么在多线程中使用泰坦图最好的做法是什么?感谢您的帮助。在多线程中使用泰坦图的最佳做法是什么?

+0

有人请帮帮我!我使用大型web服务的泰坦图,并且我真正关心泰坦图的性能,以防万一许多服务请求。 – MichaelP

回答

2

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

+0

谢谢你的回复。我想再问一个问题。我使用TitanGraph作为单例,当我打开图形时,我也从图形中产生GraphTraversalSource,并且我还像使用TitanGraph一样使用GraphTraversalSource作为单例。那么可以在多线程中使用GraphTraversalSource单例,还是需要为每个线程产生一个呢?谢谢。 – MichaelP

+1

它应该是安全的重新使用。 –

4

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

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

如果您使用的库可能在多个线程之间传递单个概念性事务,例如,这可能会更安全。通过使用延期或承诺。

+0

谢谢你的答案 – MichaelP

相关问题