【问题标题】:Is com.tinkerpop.blueprints.Graph object thread-safe?com.tinkerpop.blueprints.Graph 对象是线程安全的吗?
【发布时间】:2015-02-02 00:57:48
【问题描述】:

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

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

新实施 - 满足 SLA

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

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

编辑

如何使用对象

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

【问题讨论】:

    标签: graph titan tinkerpop tinkerpop-blueprint tinkergraph


    【解决方案1】:

    这取决于Graph 接口实现。例如,如果您使用TinkerGraph,它不保证线程安全。 Neo4jGraph 使用ThreadLocal 变量来管理事务,这意味着您可以与多个线程共享同一个Neo4jGraph 实例而不会遇到任何麻烦。蓝图还允许通过ThreadedTransactionalGraph 进行多线程事务:

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

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

    【讨论】:

    • 加一。我正在使用“com.tinkerpop.blueprints.impls.tg.TinkerGraph”obj 来表示内存中的图形。请参阅我关于该问题的编辑部分。这个对象是线程安全的还是我应该将它封装在 ThreadedGraph 中?
    • 我会谨慎对待来自不同线程的TinkerGraph 的写入。我不能说问题会是什么,但我不会保证你这样做不会有问题。我可能会生成三个单独的线程来从不同的存储中获取数据,然后从收集的数据中在单个线程中构造您的TinkerGraph
    • 如果“com.tinkerpop.blueprints.impls.tg.TinkerGraph”不是线程安全的,我将其作为备用计划。感谢您确认线程安全保证。备份计划现在是唯一的选择:-)
    • 向 TinkerGraph 添加事务支持需要什么?我可以提交补丁。我需要这个功能。另外,这里具体的线程安全问题是什么?
    • 请注意,蓝图此时主要处于维护模式,因此那里的任何开发都主要集中在错误修复上。所有关注点都在 TP3:bit.ly/1LJVBut 在这一点上,如果您需要 TP2 中的该功能,我建议您 fork TinkerGraph。在 TP3 中,TinkerGraph 具有类似的限制,因为它旨在“简单”并且用于轻量级操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2023-03-29
    • 2020-10-03
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多