2016-01-24 61 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

相關問題