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 对象
- 我是否应该关闭创建的每个 graphTraversal 对象
gts(graphTraversalSource)。?
- 我应该什么时候关闭这些对象?
对于 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 协议中删除了对收集保存在服务器上的副作用的支持,这样担心就消失了——服务器不再将副作用保存在内存中供以后检索。
我正在通过
远程连接到 janusGraphcluster = 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 对象 gts(graphTraversalSource)。?
- 我应该什么时候关闭这些对象?
对于 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 协议中删除了对收集保存在服务器上的副作用的支持,这样担心就消失了——服务器不再将副作用保存在内存中供以后检索。