在谷歌应用引擎上扩展httpservlet泄漏请求

时间:2014-02-03 17:10:55

标签: java google-app-engine servlets

我对在Google App Engine上遇到的这个问题感到困惑。

我创建了几个servlet,所以我创建了一个基类来做一些基本的重复工作。像这样:

public class MyBase extends HttpServlet {

      protected String someValue1;
      protected String someValue2;

      protected void setup(HttpServletRequest req, HttpServletResponse resp)   {

         someValue1 = req.getParameter("paramName1");
         someValue2 = req.getParameter("paramName2");

}

和servlet:

public class MyServlet extends MyBase {



    @Override
    public void doGet(final HttpServletRequest req,
                      final HttpServletResponse resp)  {

         super.setup(req, resp); 
         doWork(someValue1);
         doOtherWork(someValue2);

}

足够简单 - 这通常可以正常工作,并且在本地服务器上运行时,任何数量的负载测试都可以正常工作。此外,GAE测试适用于测试实例。在我的生产实例上,只有生产,1000个并发用户,someValue1和someValue2的值成为两个不同用户的请求! Servlet将在99%的时间内工作,100个请求中的1个最终使用来自不同请求的参数。没有任何意义,但它正在发生。

这显然是实际代码的简化版本,但我使用集成测试重现了它。

也许我错过了关于扩展httpservlet的一些细微差别?

1 个答案:

答案 0 :(得分:2)

使用HttpServlet时,最好不要使用实例变量,因为会话之间会重用HttpServlet。

通常,Java EE容器只能创建一个MyServlet实例,并为从运行doService的客户端收到的每个请求创建一个线程 - > doGet

快速解决问题,

@Override //performance suffers greatly.
    public sychronized void doGet(final HttpServletRequest req,
                      final HttpServletResponse resp)  {

或使用resp.setAttribute();