com.tinkerpop.blueprints.Graph对象是​​线程安全的吗?

时间:2015-02-02 00:57:49

标签: graph titan tinkerpop tinkerpop-blueprint tinkergraph

我有一个用例,我根据从多个数据存储中检索的数据构建图表。每个数据存储都有自己的客户端库,用于构建表示特定数据存储数据的子图

当前实施 因为,我没有任何并发​​要求,我在服务层构建一个Graph对象并将其传递给每个客户端库,并且它们将使用相同的Graph实例

新实施 - 符合SLA

为了满足SLA,我想同时从这些数据存储中提取数据。

  1. 在这种情况下,每个客户端库是否可以使用从服务层传递的相同Graph实例构建子图?
  2. 或者有更好的方法来解决这个问题吗?
  3. 修改

    如何使用对象

    1. 客户端发送REST请求以提取人员数据
    2. 人员数据存储在3个不同的数据存储中
    3. 服务层在3个不同的线程中创建com.tinkerpop.blueprints.impls.tg.TinkerGraph共享的实例,在3个不同的线程上同时从3个不同的存储中检索数据。 每个线程还负责将提取的数据添加到共享图表实例。

1 个答案:

答案 0 :(得分:2)

这取决于Graph接口实现。例如,如果您使用TinkerGraph,则不保证线程安全。 Neo4jGraph使用ThreadLocal变量来管理事务,这意味着您可以毫不费力地与多个线程共享同一个Neo4jGraph实例。蓝图还允许通过ThreadedTransactionalGraph进行多线程交易:

https://github.com/tinkerpop/blueprints/wiki/Graph-Transactions#threadedtransactionalgraph-and-multi-threads-for-one-transaction

但您必须找到支持该功能的Graph