【问题标题】:Prevent Tomcat from caching request during starup防止Tomcat在启动时缓存请求
【发布时间】:2016-03-04 06:12:00
【问题描述】:

我对 Tomcat 中的缓存请求有疑问。每当我(重新)启动我的应用程序时,Tomcat 都会在应用程序完全初始化之前开始缓存传入的请求。

有没有办法阻止 Tomcat 这样的行为?我在 -Element 中找到了“cachingAllowed”选项,但对此我不确定。

您能否就如何在初始化所有内容之前防止 Tomcat 进行缓存提供建议。我希望请求被缓存的一点是服务器启动完成时。

非常感谢,

马克

【问题讨论】:

  • 这不是一个错误,它是一个特性。什么情况让你不想缓存请求?
  • 这个特性没有问题,除非它缓存了大约1000个请求,会在应用启动后的第一毫秒执行。这会导致内存有限的系统抛出 OutOfMemoryExceptions。
  • 好的...我现在明白这个问题了。你的意思是 OutOfMemoryErrors。
  • @PeterRader 我可以以某种方式限制最大传入请求数吗?
  • 最大传入请求!= 缓存请求。您可以增加交换空间以获得更多内存。

标签: java tomcat caching


【解决方案1】:

您所描述的效果称为请求排队。默认情况下,Tomcat 启动并侦听其配置的端口。当第一个请求进来时,它会触发相应的 Web 应用程序被部署并启动。在应用程序启动之前进入的所有请求都将被阻止,并在应用程序启动完成后开始处理。

上面的描述稍微简化了一点,因为根据您的 Tomcat 连接器类型和配置,请求可能会被阻塞和排队:

  • 处理线程等待应用程序启动。限制由maxThreads 控制。
  • 请求等待处理线程。限制由maxConnections 控制。
  • 传入的 TCP 连接已被操作系统接受,但尚未由 Tomcat 处理。这由acceptCount 控制。 (顺便说一句:我将其设置为 0)

如上所述,参数的详细工作方式可能因连接器类型而异。

这是您可以控制限制并了解正在发生的事情的方法。我认为将 acceptCount 设置为 0 后效果会更好。

实际上,同样的问题和问题在:how to make http port to open after application startup in tomcat 那里也没有真正的答案。看起来这不是 Tomcat 的设计方式。我能想到但自己还没有尝试过的解决方案:

  • 找到一种方法来使用禁用的连接器启动 Tomcat(我没有找到任何参数...)并在 JMX 启动后启用它
  • 切换到从应用程序启动的嵌入式 Tomcat 或 Jetty

【讨论】:

  • 嗨。非常感谢。我将尝试设置上述设置的值。
猜你喜欢
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多