我正在通过远程连接到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是threadSafe,所以我将gts保持在静态上下文中。每个线程使用相同的对象,并且没有一个线程通过调用gts.close()关闭gts (),每个线程运行查询,对于ex:result = gts.V().has("foo","bar").valueMap().toList(),I不关闭由gts.V()创建的gts(graphTraversalSource)而不是graphTraversal对象。
发布于 2020-01-09 17:12:00
对于GraphTraversalSource,调用close()的需求取决于您构造对象的方式(例如,在您的情况下是"gts“)。DriverRemoteConnection上的javadocs解释了close()的需求。在特定情况下,将构建的Cluster对象传递给DriverRemoteConnection.using(),这意味着您希望自己控制Cluster的关闭,因此调用GraphTraversalSource.close()只会关闭GraphTraversalSource生成的用于完成其工作的任何Client实例。然后,您需要自己打电话给Cluster.close(),以便完全有序地关闭和释放资源。
close()在由GraphTraversalSource派生的GraphTraversal上的行为有一点不同,这取决于您是否正在远程处理。在您的示例中,您使用的是远程遍历,因此应该调用close()来释放服务器上的副作用(如果遍历生成任何副作用)。您的服务器是否为以后的检索收集副作用取决于您的实现,但是对于最不可知的代码,最好总是显式地这样做。请注意,遍历是在非远程(嵌入式)图形数据库上生成的,这些数据库被迭代到完成,例如hasNext()是false,将触发对close()的调用并释放图形所持有的资源。例如,调用iterate()将自动触发close()。
另外,在3.5.0中从TinkerPop协议中删除了对收集服务器上的副作用的支持,这样担心就会消失--服务器将不再有副作用保存在内存中,以供以后检索。
https://stackoverflow.com/questions/59667567
复制相似问题