【问题标题】:ServletContext parameters: are they per instance or per server?ServletContext 参数:它们是每个实例还是每个服务器?
【发布时间】:2013-11-01 11:15:51
【问题描述】:

我有一个运行 webapp 的 tomcat 服务器。在 webapp 的启动中,我使用 interface ServletContextListener 的实现类设置了一些上下文参数。我在这里初始化的参数是在不同机器上运行的数据库的几个连接对象。

我的疑问是我在这里创建的连接对象是每个实例一个(因为 tomcat 为每个客户端请求创建一个实例),还是整个 webapp 本身一个?

如果每个 webapp 一个,那么服务器是否可以同时处理大量的请求(每秒数千个请求)以对数据库执行 CRUD 操作?

【问题讨论】:

  • 你能发布你的代码吗?

标签: java rest tomcat servlets web-applications


【解决方案1】:

ServletContext 为每个 webApp 创建一个。服务器从 Web 应用程序读取 web.xml 文件,并根据您在 web.xml 上提供的配置创建ServletContext。一旦创建,它就会在 Web 应用程序的组件之间共享。如果您的服务器上安装了多个 web 应用程序,您将有多个 ServletContext - 每个用于 web 应用程序。

参考请看here

【讨论】:

    【解决方案2】:

    无论发出多少请求,都只加载一个 ServletContext。

    这甚至是 servlet 优于 CGI 的优势。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      一个 webapp 只有一个 ServletContext 实例,并且 ServletContext 中的属性是应用程序范围的。

      关于你的数据库连接,最好使用连接池(DataSource)而不是在 ServletContext 中添加 Connection 对象作为属性。

      不确定您是不是这个意思,但请求是由 Servlet 而不是 ServletContext 处理的。

      【讨论】:

      • 好吧,我的意思是整个 WebApp 只使用一个 Connection 对象(不推荐),考虑到客户端请求的每个实例,服务器是否能够同时处理大量请求必须使用相同的 Connection 对象。我想我得到了答案,现在我要对 Connection 对象进行大量更改。我还在其他地方读到,上下文参数不适用于像这样的“重”对象。仅推荐使用常量。
      • 这取决于你对大100、500、10000的定义,并记住性能。但正如你自己所说,不推荐
      【解决方案4】:

      如果您在ServletContext 上设置属性,则该属性将作用于整个应用程序。

      来自Java EE 7 Spec:

      ServletContext接口有一个实例对象 与部署到容器中的每个 Web 应用程序相关联。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 2016-10-12
        • 1970-01-01
        相关资源
        最近更新 更多