【问题标题】:What is best practice for using titan graph in multi threads?在多线程中使用泰坦图的最佳实践是什么?
【发布时间】:2016-01-24 11:30:33
【问题描述】:

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

【问题讨论】:

  • 有人请帮帮我!我将泰坦图用于大型 Web 服务,我非常关心泰坦图的性能,以防有许多服务请求。

标签: java titan tinkerpop3


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我想再问一个问题。我使用 TitanGraph 作为单例,当我打开图时,我还从图中生成 GraphTraversalSource,并且我也使用 GraphTraversalSource 作为单例,就像使用 TitanGraph 的方式一样。那么跨多个线程使用 GraphTraversalSource 单例是否可以,或者我需要为每个线程生成一个?谢谢。
    • 它应该可以安全地重复使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多