连接在认证时出现了session无效的情况


demo是这么写的

我看服务端的日志,你操作的都是同个space,那你业务多少并发你肯定是知道的,你就提前把session创建好,use到你相应的space,保存到容器里,每次从容器里面拿session就好,然后程序退出之前,再统一释放session和关闭池就好。

明白 这个已经改过来了, 还是session过期那个问题,在认证的时候依然会报这个,我很纳闷,connection已经为null了,Session not found, id[2193]这个是服务端的吧

Session not found, id[2193]这个是服务端的吧

是服务端打印,假如服务端还打印这个,然后你们只用了一个服务地址,那么说明你还在用已经被release的session,你是不是用的不是改完的代码。假如加上这个,然后你又是单线程操作session的,你执行execute是肯定会报错的。

我是这样的:每个线程的session只用10次 大于10次,这个session就release了,再为这个线程创建session,那原来的那个session跟这个线程已经没有关系了,应该不会出现用就的session,第二个问题 long sessionID = connection.authenticate(userName, password); 这个除了认证,还会返回sessionID,这个sessionID生成逻辑可以普及一下吗

你check你的代码吧,不行你就在java client的代码里面加打印,肯定是有的。

我这边上次的问题没有解决又出现了不同的问题
com.vesoft.nebula.client.graph.exception.IOErrorException: Expected protocol id ffffff82 but got 0

有的session在release之后,再创建session的时候,sessionId给我返回0

你这个要么多线程用了同个session,要么就是你用的客户端版本不对。

1 个赞

目前客户端是2.0.0 服务端是2.0.1 版本应该符合吧

还有其他问题:
1、com.vesoft.nebula.client.graph.exception.IOErrorException: Required field ‘latency_in_us’ was not found in serialized data! Struct: ExecutionResponse (
error_code : SUCCEEDED (0),
latency_in_us : 0
)
2、有的session在release之后,再创建session的时候,sessionId给我返回0

大佬有时间帮我看一下吗?这个问题很急

这个就是我上面说的问题,你用这个分支 https://github.com/vesoft-inc/nebula-java/pull/334 自己编译,然后把你们代码依赖java-client的版本改为2.0.1。这个是加了线程安全的。

谢谢大佬 我先试一下 谢谢您的答复

是服务端现在的session是线程不安全的吗?

不是,是客户端的连接是非线程安全的

其实我有个疑问哈 ,首先我利用threadlocal来实现了每个线程维护一个session,session里又有一个连接,按理说这个连接没有被多个线程所共享,不是线程安全也可以吧

但是你会把释放的session又用了,但是旧的代码没有报错,这样就会出现一个连接被多个线程用,就是有线程安全的问题

1 个赞

好的 感谢您的答复 麻烦了

你用我发的分支了试了吗