【问题标题】:Serving same servlet instance from different paths in Tomcat从 Tomcat 中的不同路径提供相同的 servlet 实例
【发布时间】:2016-01-25 15:13:17
【问题描述】:

如何指示 Tomcat 从多个路径提供同一个 servlet 实例?

例如,给定example.com/old-addressexample.com/new-address,我想从这两个地址保存相同的 servlet 实例。我不想部署 servlet 两次。独立的 Tomcat 是否可以做到这一点,无需任何 Apache HTTP 服务器/反向代理 URL 重写?

【问题讨论】:

  • 您真的关心它是否是 servlet 的实际相同实例(即相同的对象),还是只想在同一个 webapp 中使用相同的 servlet 类?因为如果是后者,只需在你的 webapp 中声明两个 servlet 映射即可。
  • @JBNizet,我想要相同的实例,原因有两个:我不想要不必要的内存消耗。在我的特殊情况下,访问同一个数据库实例的两个或多个 servlet 实例可能会导致冲突。
  • 一个对象的实例占用 16 字节的内存,所以我认为这不是一个有效的问题。即使您只有一个实例,它也会同时处理请求,因此您很可能已经同时访问同一个数据库。

标签: tomcat


【解决方案1】:

有很多不同的层次可以回答这个问题:

  • 实际的 servlet instance(在“类的实例”的意义上)与您无关:应用程序服务器本身决定它要实例化的对象实例的数量。 (通常每个 Web 应用程序只有 1 个)
  • 如果您在服务器的根路径 ("/") 上部署 Web 应用程序,您将能够将 URL /old-address/new-address 映射到同一个 servlet(同样,不必担心instance。我假设您希望部署 old-address.war 和 new-address.war - 在这种情况下,您将运行完全不同的 Web 应用程序,它们将与彼此设计。
  • 如果您要从一个应用程序名称迁移到另一个应用程序名称,那么配置正确的重定向(就此而言是永久重定向)实际上是一个优势,这样迟早每个人都会更新他们的书签和链接。

对 cme​​ts 的跟进:

servlet 不得在其实例中保留任何状态。请求同时提供服务,状态通过请求和响应对象进入。如果您担心对某些后端资源的并发访问(正如您在对该问题的评论中所述):您已经有一个错误的实现并且很幸运没有被它咬伤。即使是单个 servlet 实例也可以处理数千个并发请求(如果容器接受那么多并发连接)。

servlet object 的内存消耗也无关紧要(请参阅我的评论)

你担心错了。

【讨论】:

  • 如果我部署同一个 servlet 两次,它需要的内存是单个实例的两倍,对吧?
  • 好吧,如果你以正确的方式实现你的 servlet,那将只占几个字节。如果它有成员变量来保持请求的当前状态,那无论如何都是错误的:servlet 的状态只在请求和响应中。正如我所说:你永远不知道你最终得到了多少对象。除非您已经测量出内存是您的问题,否则不要担心内存消耗。在这种情况下:找出占用内存的内容。我的预测是它不会是 servlet 对象,而是其他东西。如果内存不足,请修复它。
【解决方案2】:

您可以像这样在 web.xml 中使用 servlet 映射:

<servlet-mapping>
  <servlet-name>yourServletName</servlet-name>
  <url-pattern>/old-address</url-pattern>
  <url-pattern>/new-address</url-pattern>
</servlet-mapping>

url-pattern 元素可以在 servlet-mapping 元素内任意重复。

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2017-08-17
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多