我使用spring boot构建了一个Web服务。我使用titan graph作为跨Web服务访问的单例。因此,如果对Web服务有多个请求,Web服务器将生成线程来处理请求,并且将在这些线程中使用titan图。这种方法有什么问题吗?我使用titan graph 1.0.0和tinkerpop 3.0.1-incubating。所以titan图对我来说很新,而且我不知道在多线程中使用titan图是否有任何冲突。如果这种方法有问题,那么在多线程中使用titan图形的最佳做法是什么?谢谢你的帮助。
答案 0 :(得分:4)
是的,去吧。如果您使用的是Titan,请务必阅读multi-threaded transactions上提供的文档。
借助蓝图'默认事务处理,每个线程自动打开自己的事务对图数据库。要打开与线程无关的事务,请使用
newTransaction()
方法。newTransaction()
方法返回表示此新打开的事务的新TransactionalGraph
对象。图形对象tx支持原始图形所做的所有方法,但不会为每个线程打开新事务。这允许我们启动多个线程,这些线程在同一个事务中同时工作,其中一个线程在所有线程完成工作后最终提交事务。
如果您使用的库可能跨多个线程进行单个概念事务,则可能会更安全,例如:通过使用延期或承诺。
答案 1 :(得分:2)
以这种方式使用Titan是完全可以接受的。您只需要确保交易不会在请求之间泄漏。根据TinkerPop语义,Graph
实例上的事务绑定到当前线程。因此,每个HTTP请求的结束都需要使用commit()
或rollback()
关闭事务,具体取决于请求的成功或失败。如果您甚至不确定是否有能力始终关闭交易,那么您应该考虑在请求开始时发出rollback()
以清除之前的状态。