代码如下: HttpSession userSession = request.getSession();
Map userMap = (Map)userSession.getAttribute("userMap");环境:ssh+mysql。
问题描述:这是一个登录过程,正常情况下没任何问题,但是在压力测试的时候,在如上代码第二行位置报java.lang.NullPointerException。
何解?
Map userMap = (Map)userSession.getAttribute("userMap");环境:ssh+mysql。
问题描述:这是一个登录过程,正常情况下没任何问题,但是在压力测试的时候,在如上代码第二行位置报java.lang.NullPointerException。
何解?
导致连接池耗尽,取不到Session.
if (userSession != null){
Map userMap = (Map)userSession.getAttribute("userMap");
}是没有取到HttpSession,最好做个判断先,再去取
如果是在第二行代码处报错,应该是userMap不存在,userSession.getAttribute("userMap");取到是空的,然后楼主又转换为Map,所以就报空指针异常了
这句话的话其实是说request==null你先确认到底哪句话仍出来的exception?
如果 HttpSession userSession = request.getSession();
if (userSession != null){
Map userMap = (Map)userSession.getAttribute("userMap");
}
这么判断,实际上也是这次登录无效。
如果保证每个request.getSession都是可用的
tomcat报这句异常
那就难说了,,,说不定还会有多线程问题.
主要看你那里写的这些代码,上下文太少. 要分析比较麻烦..
比如那里set 那里 get
中间件用的那个?这个中间件是否本身就存在多并发问题的bug 等等 既然做压力测试 那就要拿出 100万分的精神 做好思想准备作各种疑难杂症的分析处理排障
HttpSession userSession = request.getSession();
Map userMap = request.getSession()==null?null:(Map)request.getSession().getAttribute("userMap");
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具有相当强的智能,才能将用户请求分发到正确的机器上。
1、如果你的网站的确会出现压力测试下最糟糕的事情,session丢失,如果你不采用别的方式,如:增加服务器配置,采用分布式架构,集群等等,那么就给出一个友好错误提示。csdn每天会出现这种访问中断的时候,习惯了。