禁用 Servlet 池:最佳实践和注意事项

如果应用程序在该应用程序内部创建线程,或者如果您对复用请求和响应对象的 Web 容器不放心,那么可能需要禁用请求和响应池。

禁用请求和响应池

  • 应用程序正在应用程序内部创建线程。

    Servlet 2.4 规范说明了以下内容:

    请求对象的 SRV.4.10 生存期 每个请求对象仅在 Servlet 的 service 方法或过滤器的 doFilter 方法的作用域内才有效。容器通常循环使用请求对象,以便避免创建请求对象的性能开销。开发者必须意识到,在上述作用域以外维持对请求对象的引用并不是值得建议的做法,因为它可能具有不确定的结果。

    响应对象的 SRV.5.6 生存期 每个响应对象仅在 Servlet 的 service 方法或过滤器的 doFilter 方法的作用域内才有效。容器通常循环使用响应对象,以便避免创建响应对象的性能开销。开发者必须意识到,在上述作用域以外维持对响应对象的引用可导致不确定的行为。

  • 如果您对复用请求和响应对象的 Web 容器不放心。因为复用了这些对象,所以两个独立应用程序中的两个请求可能对同一请求或响应对象具有访问权,如 Servlet 2.4 的“线程安全”部分所述。

    SRV.2.3.3.3 线程安全 不保证请求和响应对象的实现是线程安全的。这意味着只应在请求处理线程的作用域内使用它们。

    对请求和响应对象的引用不应对其他线程中执行的对象进行,因为产生的行为可能不确定。如果应用程序创建的线程使用容器管理的对象(例如,请求或响应对象),那么必须只在 Servlet 的服务生命周期内访问这些对象,并且这类线程本身具有的生命周期应该在 Servlet 的 service 方法的生命周期内,因为在 service 方法结束之后访问这些对象可能会导致不确定问题。请注意请求和响应对象不是线程安全的。如果在多个线程中访问了这些对象,那么访问应该已同步或者是通过包装器来完成的,以增加线程安全,例如,使对访问请求属性的方法的调用同步或将本地输出流用于线程内响应对象。

请注意,以下内容很重要:禁用池将防止 Web 容器循环地将 Servlet 请求和 Servlet 响应对象用于后续请求。由于在请求和响应对象的创建以及对这些废弃对象的后续垃圾回收方面有所增长,所以这会导致额外的开销。

指示主题类型的图标 参考主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rweb_servlet_pooling
文件名:rweb_servlet_pooling.html