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造成的。那如何解决呢
- 查询语句是什么?
- 使用的环境有变化吗? 同样的配置/环境/版本之前没有问题, 现在突然出现问题了吗?
如果短时间内大量申请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查询操作,没有释放。之前是可以的。
因为之前你们有个同事说,session打开之后不用关闭
要么客户端与服务端版本不匹配,要么你是多线程使用了同一个session。 session不支持多线程使用的。 如果你想多线程使用,那就在线程内部单独getSession,然后使用,使用完release释放。
那新版本的jar发我一下把,另外其实我之前就是按照你们demo提供的每次查询都单独初始换线程池获取session,然后释放。后来你们有个同事说同样的查询操作这样吃性能
你为啥要单独初始化线程池, 这样就是耗性能啊。
在主线程初始化线程池,线程内部单独getSession,然后使用,使用完release释放,这样session可以复用。
哦,你的意思是我初始换线程池,然后再调用执行查询时在单独获取session,然后释放
线程池用关闭吗
最后用完了要关闭啊。
那这样如果并发的情况下,我每次都得获取线程池吗。我现在的做法是依赖注入的时候将线程池初始化注入进去。然后执行查询的会后从线程池中获取session,查询完毕后关闭session
因为我现在就只是一个插叙sql,没有别的操作,你有啥好的建议
你这种用法是对的,注入的时候一个jvm中只会有一个pool。
你还要再加一个close 方法,内部做pool的关闭。
你查询完毕不要关闭session,要release session。