JanusGraph/tinkerpop 中的连接泄漏

Leaking connection in JanusGraph/tinkerpop

我正在通过

远程连接到 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 保持在静态上下文中。每个线程使用相同的对象,线程的 none 通过调用 gts.close() 关闭 gts 每个线程运行查询,例如: result = gts.V().has("foo","bar").valueMap().toList() 我既不关闭 gts(graphTraversalSource) 也不关闭由 gts.V()

创建的 graphTraversal 对象

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

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

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