最近在用Servlet设计接口用来测试时,发现一个奇怪的问题。
就一个很简单的程序,功能是接收客户端的请求,从数据库中获取数据,然后返回。
话不多说,先上代码:
好了,接口开发完了,我们用Jmeter测试一下这个接口的情况,用单并发循环100次:
从结果开,很不错,接口没有失败的(Error %= 0),那我们把并发变成2,同样循环100次:
出问题了,ERROR % = 1.00%, 代表接口返回出了问题,那我们看下问题的原因是什么:
竟然是空指针,但是Jmeter给的信息也太少了,我们可以再查一下tomcat的日志:
好了,这样就清楚了,是rs这个实例为空,但是为什么会这样呢?
仔细查了一下代码后,并再看了一遍Servlet的运行原理,发现了问题原来在这句上:
在正常情况下,应该每个请求都是一个单独的线程处理,可以代码中却有了一个成员变量“rs”,当然会出现为空的问题,因为也许就在这个线程正要用到rs的时候,另外一个线程已经把他释放了。
那好,现在我们需要做的就是把这个变量变成局部变量:
然后我们在用Jmeter试一下并发变成2,同样循环100次:
没问题,将并发变成10再试试:
没有问题!
好了,这其实对于各位开发同事来说只是一个小问题,没难度。但是它提醒我们,在开发时,我们不仅要关注产品的功能,还要考虑到影响到产品性能或压力下运行的问题。线程安全就是其中之一,测试人员要注意哦~