java-client threadLocal问题

现在我看java客户端是放到threadLocal中的,有什么目的吗,线程不安全?我现在用springboot,自己把ClientImpl拷出来改成非ThreadLocal的,这样使用有什么问题吗 谢谢

com.facebook.thrift.protocol.TProtocolException: Expected protocol id ffffff82 but got 0
偶尔会报这个错误

java client不允许多线程使用。你应该是多线程使用同个client。

多个线程同时使用顶多是数据冲突,为什么会报这个错误

client的不是线程安全的,你多个线程同时使用的话,client内部的buf就被写乱了。

使用 Exchange 导入数据也报了楼主在二楼提到的错误,难道是同一个问题?

ThreadLocal 线程本地变量 如果多个线程操作同一个对象的话 每个线程都持有这个变量的一个副本 内存上不存在并发 从而规避了并发问题。

我现在想定时执行脚本,每个脚本都会使用到 val session: Session = NebulaManager.session,我发现如果是同时执行多个的话,会报 com.facebook.thrift.protocol.TProtocolException: Expected protocol id ffffff82 but got 0 这个错误。如果时间错开几分钟就没问题,请问除了调整时间还有别的解决办法吗~

你的session是不能同时被多个线程同时用的,一个session也就是一个连接只能被一个线程用。

那就是我有两个定时脚本需要执行,只需要把时间错开就行吗,因为我看间隔 15 秒以上就没有问题了

不知道你的脚本是怎么实现的,但是15可能就刚好是你执行完那些语句的时间而已,这个不是一个固定的值,不能这样去搞的。你只要保证一个线程用一个session就不会有这问题。

1 个赞

umm…要怎么保证一个线程用一个 session 呀 :joy: :joy:

自己写的代码还不知道吗? :rofl:

1 个赞

请问下:
目前使用NebulaPool进行多次getSession来进行多线程使用,发现getSession这一过程耗时需要4-8ms,但是查询时延resp.getLatency 只有1~2ms,这正常吗? 连接耗时太久了些,请问有什么方式可以让连接时间不超过查询时间吗?感谢

这个帖子有些历史了,回复以上面帖子为准哈。