【问题标题】:Leaking connection in JanusGraph/tinkerpopJanusGraph/tinkerpop 中的连接泄漏
【发布时间】:2020-01-09 15:44:57
【问题描述】:

我正在通过

远程连接到 janusGraph
cluster = Cluster.build()
                .addContactPoints(uri.split("\\|"))
                .port(port)
                .serializer(new GryoMessageSerializerV1d0(GryoMapper.build().addRegistry(JanusGraphIoRegistry.getInstance())))
                .maxConnectionPoolSize(poolSize)
                .maxContentLength(10000000)
                .create();
        gts = AnonymousTraversalSource
                .traversal()
                .withRemote(DriverRemoteConnection.using(cluster));

由于 gts 是线程安全的,我将 gts 保持在静态上下文中。每个线程都使用相同的对象,并且没有一个线程通过调用 gts.close() 关闭 gts 每个线程运行查询,例如: result = gts.V().has("foo","bar").valueMap().toList() 我不关闭由gts.V()创建的 gts(graphTraversalSource) 和 graphTraversal 对象

  • 我是否应该关闭创建的每个 graphTraversal 对象 gts(graphTraversalSource).?
  • 我应该什么时候关闭这些对象?

【问题讨论】:

    标签: gremlin tinkerpop tinkerpop3 janusgraph gremlin-server


    【解决方案1】:

    对于GraphTraversalSource,调用close() 的需要取决于您构造对象的方式(即,在您的情况下为“gts”)。 DriverRemoteConnection 上的 javadocs 解释了 close() 的要求。在您的特定情况下,您将构造的Cluster 对象传递给DriverRemoteConnection.using(),这意味着您希望自己控制Cluster 的关闭,因此调用GraphTraversalSource.close() 只会关闭您的任何Client 实例GraphTraversalSource 产生了它的工作。然后,您需要自己致电Cluster.close() 以获得完全有序的关闭和资源释放。

    GraphTraversal 上的 close() 的行为是从 GraphTraversalSource 生成的,这取决于您是否正在远程处理。在您的情况下,您正在使用远程遍历,因此应调用 close() 以释放服务器上的副作用(如果遍历生成任何副作用)。您的服务器是否收集副作用以供以后检索取决于您的实现,但对于最不可知的代码,最好始终明确地这样做。请注意,在迭代完成的非远程(嵌入式)图形数据库上产生的遍历,例如 hasNext()false,将触发对 close() 的调用并释放图形持有的资源。例如,调用iterate() 会自动触发close()

    附带说明一下,在 3.5.0 中从 TinkerPop 协议中删除了对收集服务器上保存的副作用的支持,因此担心会消失 - 服务器根本不会再将副作用保存在内存中以供以后使用检索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 2017-02-15
      • 1970-01-01
      相关资源
      最近更新 更多