【问题标题】:impact of javax.servlet.Filter on performance?javax.servlet.Filter 对性能的影响?
【发布时间】:2011-06-08 09:59:40
【问题描述】:

我想知道是否有任何关于使用过滤器成本的硬数据? 例如,在 servlet 上使用继承来共享行为还是使用过滤器?

谢谢,

安东尼

【问题讨论】:

    标签: java performance servlets servlet-filters


    【解决方案1】:

    如果有人可以发布硬数据,我会感到惊讶。即使他们这样做了,也很可能与您无关,因为这些数字将取决于过滤器中正在执行的操作。它也可能属于过早的优化类别——除非你真的把事情搞砸了,否则它可能并不重要。

    我假设“遗产”的意思是“继承”,并说过滤器是一个更好的解决方案。您可以选择在配置中关闭和打开它们。

    过滤器是 HTTP 请求的装饰器或方面。既然这些都是备受推崇的、久经考验的模式,为什么它们对 servlet 的使用没有用处和安全?

    我会说你的担心被夸大了。

    话虽如此,我不建议构建如此长而复杂的过滤器链,以至于性能确实会成为问题。如果您进行压缩、日志记录、性能指标等操作,最终可能会遇到问题,并最终得到一打过滤器的链。

    【讨论】:

    • 但是,如果您需要进行压缩、日志记录、性能指标等,无论是在过滤器中实现还是在其他方面都需要相同的时间。我不喜欢过滤器的唯一部分是深度堆栈跟踪,但这是装饰性的并且远低于允许的堆栈调用深度。然后是“移动部件太多”的问题(即配置开销)。
    • @Thilo:您可以在 Java EE 6 中无需配置。因此,这也解决了。
    • EE6 是一个很大的改进,因为 XML 消失了,但您仍然需要在某个地方进行配置(当然,使用注释它对 IDE 和程序员更友好)。
    【解决方案2】:

    没有什么可衡量的,与您在过滤器中所做的实际工作相比完全相形见绌。甚至每次都不会创建一个新的 Filter 实例,就像它们共享的 Servlet 一样。

    相对于继承的最大优势是能够在运行时配置和组合(一个父类被编译进去,并且只能有一个)。

    需要考虑的一点是,过滤器只能包装请求:它可以在之前和之后(或相反)添加代码。并且在 Servlet 运行之后,响应可能已经被提交。它不能将代码注入到请求处理的中间,而正确定义的回调到父类(或 Servlet 端的一些其他技术)可以做到这一点。这意味着过滤器可能不适合某些任务。

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2011-09-12
      • 2020-03-06
      • 2011-04-15
      相关资源
      最近更新 更多