关于nebula-java的client使用的遇到一些问题

nebula 版本:v3.2.1
client 版本:3.0.0
部署方式:单机
安装方式:RPM
是否为线上版本:Y
硬件信息
磁盘( HDD)
CPU、内存信息
Java程序连接nebula一段时间后,就会管道破裂

出现该问题后我在论坛中查找到需要在执行完sql后使用release()方法来释放session
之后再getsession()
然后我在执行sql的方法中添加代码段,并把连接数重新设置


image

在这之后使用一段时间没问题,然后就出现了获取到session之后,
在使用session.execute()方法切换图空间的时候,会直接走到这一步

再补充一个出现的问题


在多次查询 具体的数量没有统计,方法进入后,this.connectionIsBroken.get()这个方法返回为false

感觉像是网络不稳定,client 和 server 之间的网络环境是什么样的?能保证连接的稳定么?

实在同一个服务器内的.yml中配置是用的127.0.0.1

OK,请 @Aiee @nicole 帮忙看看,这个socket总是坏掉可能是啥原因呢?

进入这个方法后session.execute()
然后就到了下图中,从this.client.executeWithParameter()这个方法中出来之后 直接就进入到catch中了

等下,这个是不是 idle 时间长了 session 过期了哈?

如果是这个问题,用最新的 java client 3.3.0,里边支持了 session pool,就不用担心这个问题啦,要不你试试哈?例子参考

嗯嗯, 谢谢 我去修改一下,能解决的话就太好了

1 个赞

出错后服务状态正常吗? 看着像graph挂了

1 个赞

这个我倒是没注意看.现在已经改了一部分了 :dotted_line_face:
我看里面方法都是使用的静态方法 我在创建sessionpool的时候不用静态方法有问题吗

我每次请求进入都要去重新获取一次SessionPool吗

Session Pool 是一个 pool,一个进程搞一个单例,pool 的大小根据你的并发量来定

cc @nicole @Aiee 纠正我的理解哈

我在项目启动的时候创建一个pool,然后在业务层调用该pool,每次方法执行完成后都去close() ,还是我每次执行方法的时候去创建pool,然后运行完成后去执行close

正确 :+1:

1 个赞

每一个请求都用同一个 SessionPool 去 execute(),只有服务关闭的时候要 close session pool

cc @Aiee

2 个赞

这个session pool里面的ResultSet 有内部的转换方法吗,还是要自己写转换

看你要做什么转换,你可以点进ResultSet这个类中,里面有一些转换方法的

比如用GET SUBGRAPH 获取到的结果 VERTICES和EDGES


应该解析成一对多的实体. 我在examples里面看到这个方法printResult()
转换的结果好像还需要进一步的解析处理.不能直接转换成json格式

数据类型分为原始的基本类型比如 string, int 等和图的类型,比如 vertex, edge,这些类型 ResultSet 都有一个封装过的格式,好处是可以方便取里边的关键系信息,这些封装的格式要通过 asXxx 来获得,参考

https://www.siwei.io/nebula-java-happy-parsing-guide/

比如 vertices 中的一个元素是 vertex,可以用 asNode() 来解析,之后的结果里有一些糖方法可以针对 node/vertex 类型做

edges 中的一个元素是 edge,可以用 asRelationship() 来做。

感谢