【问题标题】:extending httpservlet on google app engine leaks requests在谷歌应用引擎上扩展 httpservlet 泄漏请求
【发布时间】:2014-02-03 17:10:55
【问题描述】:

我对在 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 的细微差别?

【问题讨论】:

    标签: java google-app-engine servlets


    【解决方案1】:

    使用HttpServlet,最好不要使用实例变量,因为HttpServlet是在session之间复用的。

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

    要快速解决您的问题,要么

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

    或使用resp.setAttribute();

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多