论坛首页 Java企业应用论坛

负载均衡引发的线程变量问题

浏览 6255 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-22  

hunteagle 写道:
前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, 当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程, 其中已经没有了用户ID,这相当于是没有登录的状态.






你的这个理解应当是不对的。
1)用户的ID如果保存在线程变量中,那么这个ID是瞬时状态的,下次用户访问,这个线程变量就不存在了。我觉得你可能没有理解你们现在如何保存用户ID的机制,一般来说,最终用户登录的状态数据都是保存在session中的。

2)如果用户ID的确在线程变量中,那么对于是否处于集群环境下,应当是没有区别的。因为A服务器节点上的一个线程的处理,不会转入到B节点上。至于用户第一次访问由A处理,下一次可能由B处理,那完全不是线程的概念。即便没有集群,两次访问也不一定是同一个线程来响应。
0 请登录后投票
   发表时间:2007-07-23  

集群跟线程局部变量怎么扯的上关系???

0 请登录后投票
   发表时间:2007-07-23  

hunteagle 写道:

公司现在打算使用两个tomcat来进行负载均衡, 调试时发现了问题.

以前没有使用负载均衡时,前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, 当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程, 其中已经没有了用户ID,这相当于是没有登录的状态. 如果要将用户ID作为一个调用参数传入业务层的话, 接口改动将会很大.
请问各位有什么好的办法可以解决这个问题, 或者是有其它的折衷的方法可以避免对接口的过大程度的修改?
谢谢!



怀疑对thread理解有误
即使是同一个tomcat两次请求也不能保证用同一个thread,所以每次请求开始时都应该清除thread中自己关心的数据,保证改次请求的数据不受之前request的影响
0 请登录后投票
   发表时间:2007-07-23  
如果只是增加一个tomcat,可以考虑采用session粘连的方式。用户请求以后,一直都会访问同一个tomcat;tomcat本身连集群都不需要做,对应用来说和单台tomcat没有任何区别。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics