gpt4 book ai didi

java - 在谷歌应用程序引擎上扩展 httpservlet 泄漏请求

转载 作者:行者123 更新时间:2023-11-30 04:02:50 27 4
gpt4 key购买 nike

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

最佳答案

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

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

要快速解决您的问题,可以

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

或者使用resp.setAttribute();

关于java - 在谷歌应用程序引擎上扩展 httpservlet 泄漏请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com