繁体   English   中英

每个tomcat服务器只有一个servlet对象吗?

[英]Is there only one servlet object per tomcat server?

我做了一个简单的测试,然后从不同的浏览器和命令行工具执行了我的测试servlet。 无论我在哪里执行,它都会显示相同的“ hohoho time”。 我对此绝对满意,我只想知道两件事:

a)如果我可以依靠不同版本的tomcat(今天我使用7.54版)

b)这是否意味着一个servlet永远不会在不同的线程中并行执行(即,两个用户在同一时间请求同一个servlet)

@WebServlet(name="test servlet 2", urlPatterns={"/test2"}, loadOnStartup=1)
public class Test2 extends HttpServlet {
    private String test = "baaa .. :-(";

    @Override
    public void init(ServletConfig config) throws ServletException {
        DEBUG("Server starts");
        this.test = "hohoho " + System.currentTimeMillis();
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletOutputStream out = resp.getOutputStream();

        out.write(test.getBytes());

        out.flush();
        out.close();
    }
}

实际上,servlet容器仅为每个servlet创建一个实例。 这有助于您将状态保存在servlet成员变量中。 但是,这并不意味着servlet容器不能使用同一servlet实例同时处理服务器请求。 这就是servlet包含的内容(包括Tomcat)。 因此,您的servlet必须是线程安全的。 请参考本文以获取详细信息: http : //tutorials.jenkov.com/java-servlets/servlet-concurrency.html

每个HttpServlet仅有一个实例,并且在构造HttpServlet时,其init()方法仅被调用一次。 但是,对于每个请求,doGet()在不同的线程中调用,并且可以并行发生。

我对您的问题有以下看法。

a )是,至少从tomcat 7开始。对于tomcat 6( annotation support ),您必须检查规格。

b )关于在并行线程中执行,默认情况下,servlet不是线程安全的,以确保线程安全,Servlet service()方法不应访问任何成员变量,除非这些成员变量本身是线程安全的。

有关线程安全的更多信息: Servlet线程安全

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM