在多线程中使用Titan图的最佳实践是什么?

3

我使用Spring Boot构建了一个Web服务。我将Titan Graph作为单例模式用于跨Web服务访问。因此,在多个请求到达Web服务时,Web服务器会生成线程来处理请求,并在这些线程中使用Titan Graph。这种方法是否存在问题?我使用的是Titan Graph 1.0.0和TinkerPop 3.0.1-incubating。因此,Titan Graph对我来说是比较新的,我不知道在多线程中使用Titan Graph是否会有冲突。如果这种方法存在问题,那么在多线程中使用Titan Graph的最佳实践是什么?感谢您的帮助。


有人能帮帮我吗?我正在使用Titan图形库来构建大规模的Web服务,我非常关心在服务接收到许多请求时Titan图形库的性能表现。 - MichaelP
2个回答

4

好的,可以开始。如果您正在使用Titan,请务必阅读多线程事务文档。

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

如果您使用可能跨多个线程传递单个概念事务的库(例如通过deferreds或promises),则这可能更安全。


2

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


谢谢您的回复。我想再问一个问题。我使用TitanGraph作为单例,在打开图形时,我还从图形中生成GraphTraversalSource,并且我也像使用TitanGraph一样将GraphTraversalSource用作单例。那么在多个线程中使用GraphTraversalSource单例是否可以,还是每个线程都需要生成一个?谢谢。 - MichaelP
1
it should be safe for re-use. - stephen mallette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接