JanusGraph/tinkerpop 中的连接泄漏

Nis*_*mar 1 gremlin tinkerpop tinkerpop3 gremlin-server janusgraph

我通过远程连接到 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));
Run Code Online (Sandbox Code Playgroud)

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

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

ste*_*tte 5

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

close()aGraphTraversal生成的 a 的行为GraphTraversalSource略有不同,具体取决于您是否正在远程处理。在您的情况下,您使用的是远程遍历,因此应该调用close()以释放服务器上的副作用(如果遍历产生了任何副作用)。您的服务器是否收集副作用以供以后检索取决于您的实现,但对于最不可知的代码,最好始终明确地这样做。需要注意的是遍历催生超过被重复以完成非远程(嵌入的)图形数据库,使得hasNext()false,将触发到呼叫close()并释放资源以图形保持。例如,调用iterate()close()自动触发。

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