3

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

4

2 回答 2

4

是的,去吧。如果您使用的是 Titan,请务必阅读有关多线程事务的文档。

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

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

于 2016-01-25T13:58:51.977 回答
2

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

于 2016-01-25T11:18:25.503 回答