代码如下:      HttpSession userSession = request.getSession();
      Map userMap = (Map)userSession.getAttribute("userMap");环境:ssh+mysql。
问题描述:这是一个登录过程,正常情况下没任何问题,但是在压力测试的时候,在如上代码第二行位置报java.lang.NullPointerException。
何解?

解决方案 »

  1.   

    LZ一定是用了Session的延时关闭技术,或session使用后没有及时关闭,
    导致连接池耗尽,取不到Session.
      

  2.   

    HttpSession userSession = request.getSession();
    if (userSession != null){
          Map userMap = (Map)userSession.getAttribute("userMap");
    }是没有取到HttpSession,最好做个判断先,再去取
      

  3.   

    Session是不用关闭的,在配置文件中可以配置session的超时时间。
    如果是在第二行代码处报错,应该是userMap不存在,userSession.getAttribute("userMap");取到是空的,然后楼主又转换为Map,所以就报空指针异常了
      

  4.   

    是:HttpSession userSession = request.getSession(); 这句话抛出?
    这句话的话其实是说request==null你先确认到底哪句话仍出来的exception?
      

  5.   

    这是一个登录过程,要保证可用性
    如果 HttpSession userSession = request.getSession();
    if (userSession != null){
      Map userMap = (Map)userSession.getAttribute("userMap");
    }
    这么判断,实际上也是这次登录无效。
    如果保证每个request.getSession都是可用的
      

  6.   

    取不到值是不是没有setAttribute啊~
      

  7.   

    Map userMap = (Map)userSession.getAttribute("userMap");
    tomcat报这句异常
      

  8.   

    你在压力测试阿?
    那就难说了,,,说不定还会有多线程问题.
    主要看你那里写的这些代码,上下文太少. 要分析比较麻烦..
    比如那里set 那里 get 
    中间件用的那个?这个中间件是否本身就存在多并发问题的bug 等等 既然做压力测试 那就要拿出 100万分的精神 做好思想准备作各种疑难杂症的分析处理排障
      

  9.   

    既然是压力测试下,出现的:
     HttpSession userSession = request.getSession();
     Map userMap = request.getSession()==null?null:(Map)request.getSession().getAttribute("userMap");
      

  10.   

    1、你的session是保存在服务器端还是保存在客户端(也就是通过cookies技术保存)。
    2、session如果保存在服务器端,一般的做法,是将session对象保存在内存里。同一时间,会有很多session被保存在服务器的内存里。由于内存是有限的,较好的服务器会把session对象的数据交换到文件中,以确保内存中的session数目保持在一个合理的范围内。你做压力测试,你的session对象有可能过多,服务器内存中无法存入更多,导致某些情况下数据丢失。
    3、你是否采用集群部署服务器?
    为了提高系统扩展性和可用性,我们会使用集群技术 —— 就是一组独立的机器共同运行同一个应用。对用户来讲,集群相当于一台“大型服务器”。而实际上,同一用户的两次请求可能被分配到两台不同的服务器上来处理。这样一来,怎样保证两次请求中存取的session值一致呢?一种方法是使用session复制:当session的值被改变时,将它复制到其它机器上。这个方案又有两种具体的实现,一种是广播的方式。这种方式下,任何一台服务器都保存着所有服务器所接受到的session对象。服务器之间随时保持着同步,因而所有服务器都是等同的。可想而知,当访问量增大的时候,这种方式花费在广播session上的带宽有多大,而且随着机器增加,网络负担成指数级上升,不具备高度可扩展性。另一种方法是TCP-Ring的方式,也就是把集群中所有的服务器看成一个环,A→B→C→D→A,首尾相接。把A的session复制到B,B的session复制到C,……,以此类推,最后一台服务器的session复制到A。这样,万一A宕机,还有B可以顶上来,用户的session数据不会轻易丢失。但这种方案也有缺点:一是配置复杂;二是每增添/减少一台机器时,ring都需要重新调整,这将成为性能瓶颈;三是要求前端的Load Balancer具有相当强的智能,才能将用户请求分发到正确的机器上。
      

  11.   

    应该是你说的第二种情况,请问如何处理,使用第三方工具存储session?
      

  12.   


    1、如果你的网站的确会出现压力测试下最糟糕的事情,session丢失,如果你不采用别的方式,如:增加服务器配置,采用分布式架构,集群等等,那么就给出一个友好错误提示。csdn每天会出现这种访问中断的时候,习惯了。
      

  13.   

    问题解决了,并非SESSION池爆满,而是一个action生存周期的问题,谢谢楼上各位