Gremlin JanusGraph/tinkerpop中的泄漏连接

Gremlin JanusGraph/tinkerpop中的泄漏连接,gremlin,tinkerpop,tinkerpop3,janusgraph,gremlin-server,Gremlin,Tinkerpop,Tinkerpop3,Janusgraph,Gremlin Server,我正在通过远程连接到janusGraph cluster = Cluster.build() .addContactPoints(uri.split("\\|")) .port(port) .serializer(new GryoMessageSerializerV1d0(GryoMapper.build().addRegistry(JanusGraphIoRegistry.getInstance()

我正在通过远程连接到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(graphTraversal源)和graphTraversal对象

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

对于
GraphTraversalSource
,调用
close()
的需要是由您构造对象的方式驱动的(即在您的情况下为“gts”)。
DriverRemoteConnection
上的javadocs解释了
close()
的要求。在您的特定情况下,您将构造的
Cluster
对象传递给
DriverRemoteConnection.using()
,这意味着您希望自己控制
集群的关闭,因此调用
GraphTraversalSource.close()
将只关闭您的
GraphTraversalSource
为完成其工作而生成的任何
客户端
实例。然后,您需要自己调用
Cluster.close()
以获得完全有序的关闭和资源释放

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


作为补充说明,在3.5.0中,TinkerPop协议中删除了对收集服务器上保存的副作用的支持,这样担心就消失了——服务器将不再在内存中保存副作用以供以后检索。

对于
GraphTraversalSource
,需要调用
close()
是由您构造对象的方式驱动的(即在您的案例中为“gts”)。
DriverRemoteConnection
上的javadocs解释了
close()
的要求。在您的特定情况下,您将构造的
Cluster
对象传递给
DriverRemoteConnection.using()
,这意味着您希望自己控制
集群的关闭,因此调用
GraphTraversalSource.close()
将只关闭您的
GraphTraversalSource
为完成其工作而生成的任何
客户端
实例。然后,您需要自己调用
Cluster.close()
以获得完全有序的关闭和资源释放

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

作为补充说明,在3.5.0中,TinkerPop协议中删除了对收集服务器上保存的副作用的支持,这样担心就消失了——服务器将不再在内存中保存副作用以供以后检索