java集成nebula,执行查询报错

com.vesoft.nebula.client.graph.exception.IOErrorException: Expected protocol id ffffff82 but got 31
at com.vesoft.nebula.client.graph.net.SyncConnection.execute(SyncConnection.java:74)
at com.vesoft.nebula.client.graph.net.Session.execute(Session.java:46)

不要删模版啊。Nebula 版本号要加上啊,还有客户端版本号也是啊,信息多一点更有利于快速解决问题,省去不必要的咨询时间啊。

nebula版本v2.0.1,客户端版本是2.0.0,之前还好好的

参考下,下次可以尝试用报错信息去搜一下

我没说2.1.0啊,你指的这个报错是多个线程同时使用session造成的。那如何解决呢

  1. 查询语句是什么?
  2. 使用的环境有变化吗? 同样的配置/环境/版本之前没有问题, 现在突然出现问题了吗?

如果短时间内大量申请session然后释放,2.0.0的java client的release是有问题的,没有把connection只为null,所以当你release的时候,然后你外面有可能接着用这个session的时候,但是这个session的持有的连接已经放回池里,所以你外部去用的时候也没有报错,但是池认为这个连接是释放.

解决方法是升级 java client, 使用 https://github.com/vesoft-inc/nebula-java/pull/334 分支编译, 然后把你们代码依赖java-client的版本改为2.0.1

我现在没有做释放操作,就是初始化session之后,通过注入,然后执行match查询操作,没有释放。之前是可以的。


你的意思是我吧这个改成2.0.1就好了吗

因为之前你们有个同事说,session打开之后不用关闭

要么客户端与服务端版本不匹配,要么你是多线程使用了同一个session。 session不支持多线程使用的。 如果你想多线程使用,那就在线程内部单独getSession,然后使用,使用完release释放。

那新版本的jar发我一下把,另外其实我之前就是按照你们demo提供的每次查询都单独初始换线程池获取session,然后释放。后来你们有个同事说同样的查询操作这样吃性能

你为啥要单独初始化线程池, 这样就是耗性能啊。
在主线程初始化线程池,线程内部单独getSession,然后使用,使用完release释放,这样session可以复用。

哦,你的意思是我初始换线程池,然后再调用执行查询时在单独获取session,然后释放

线程池用关闭吗

最后用完了要关闭啊。

那这样如果并发的情况下,我每次都得获取线程池吗。我现在的做法是依赖注入的时候将线程池初始化注入进去。然后执行查询的会后从线程池中获取session,查询完毕后关闭session

因为我现在就只是一个插叙sql,没有别的操作,你有啥好的建议

你这种用法是对的,注入的时候一个jvm中只会有一个pool。
你还要再加一个close 方法,内部做pool的关闭。

你查询完毕不要关闭session,要release session。