Gremlin JanusGraph/tinkerpop中的泄漏连接
我正在通过远程连接到janusGraphGremlin 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()
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协议中删除了对收集服务器上保存的副作用的支持,这样担心就消失了——服务器将不再在内存中保存副作用以供以后检索