【问题标题】:Is Spring MVC is performance issue in web application which is having more number of hitsSpring MVC 是 Web 应用程序中的性能问题吗?
【发布时间】:2014-08-23 14:49:05
【问题描述】:

我对 Spring MVC 了解不多,但这个问题是基于旧 MVC 框架的假设。为什么我想看到多个请求是由单个实例处理的,即控制器(默认情况下,spring bean 是单例的)。所以在这种情况下,如果该网站的用户数量非常庞大,这是一个性能问题。

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    我不太明白你到底在问什么。

    spring beans 默认是单例的

    是的,他们是。这是完全有道理的:一旦容器被引导,您就拥有了响应请求所需的所有实例。事实上,它们在整个生命周期中被实例化一次并且只有一个实例,这有助于降低创建新实例的影响。

    想想负载下的系统:

    如果它们不是单例,每个请求都会创建一个新的控制器实例。这需要(很少)时间,但完全需要时间。然后在响应请求后,不再需要这些实例。一个新请求将创建一个新实例。所以你用大量的“一次性对象”乱扔你的JVM,这些对象必须在某个时间点进行垃圾收集。这会导致 GC 暂停。这是不受欢迎的行为。因此,为了提高吞吐量和响应时间,使用Singletons 是有意义的(在 Spring-sense 中)。

    所以在这种情况下,如果该网站的用户数量非常庞大,这是一个性能问题。

    不,相反:这 - 正如我所说 - 提高了性能。

    当然,如果您担心Slashdot Effect,使用带有多个冗余实例和前面的负载均衡器的服务器布局是明智之举。但这是另一个主题的主题。

    【讨论】:

    • 感谢您的回复:
    【解决方案2】:

    使用一个或 10000 个实例这一事实对性能没有任何影响。

    重要的是并行工作的线程数。无论这些线程都使用单个实例还是每个都有自己的控制器实例都不会改变任何事情。

    【讨论】:

    • »使用一个或 10000 个实例这一事实对性能没有任何影响。« 我对此表示怀疑。正如我所写的,效果将是次要的、间接的:更多的对象在你的 JVM 中乱扔垃圾,因此 GC 必须花费更多的时间来清理这些混乱。另一方面:是的,有一堆大型服务器和足够的工作线程,你不会注意到,但效果会在那里。
    • 让我们来看看 Struts2 与 Spring MVC。 Struts 2 为每个请求实例化一个控制器,并将请求参数存储在控制器中。 Spring MVC 总是重用同一个控制器,但是为每个请求创建一个命令对象(和许多其他对象,顺便说一句)来保存请求参数。所以你总是有一堆由请求创建的对象。这并不是使某些事情变得更快或更慢的原因。 JVM 在创建大量短期对象和垃圾收集方面非常聪明和快速。重要的是访问共享资源、正确的数据库查询等。
    • D'accord。除了大量控制器对象之外,数据库是您的瓶颈或其他东西的可能性更高。但问题是,Singletons 是否高效。答案是肯定的。
    • 我不同意这一点。我不同意的是非单例控制器的性能自动低于单例控制器。 OP 似乎认为请求,因为它们是由单个控制器处理的,所以是要按顺序一个一个处理的队列。显然情况并非如此。单个实例并行处理多个请求。每个请求都在一个线程中处理。
    • 这里我想多加一个,Struts 2 with spring integration,这样到时候struts 2 spring 插件工具也会为每个请求创建多个action实例。那么,如果该操作被注入服务会怎样。所以这次每个动作都会在动作实例中获得新的服务实例?
    【解决方案3】:

    多个请求由单个控制器实例处理不是线程安全的!开发者在某些情况下必须添加同步进程,这将是性能瓶颈!如果每个控制器实例请求,控制器是线程安全的,大多数情况下不需要同步。至于创建多个控制器实例,这不会造成严重的性能问题,而且现代计算机的内存已经足够大了。

    PS:正如我在我的 cmets 中提供的:

    这不是一个正确或错误的选择,每个控制器的请求和单例控制器是两种策略。很难说哪个更好或更坏。我刚才说线程安全是这两种策略的一个重要关注点。

    【讨论】:

    • 然而,最常用的 Java Web 框架使用单例控制器。去图吧。
    • @JBNizet 不!大多数现代的 java web 框架不使用单例控制器! Strut2 就是一个很好的例子。它是从 strut1 更新的,它是来自工作的单例控制器!显然,requet-per-controller 是 java web 框架的主流!你去想!
    • 没有人使用 Struts2。而且我不认为它是现代的。很多人使用Struts1,没有线程安全问题。现在使用最多的框架是 Spring MVC,它使用单例控制器和服务,并且不存在线程安全问题。说单例控制器会导致线程安全问题是无稽之谈。如果你不明白你在做什么,它会这样做。如果控制器不是单例,这也是正确的。
    • 如果你使它们成为线程安全的,它们就是线程安全的。如果您使它们成为非线程安全的,则它们不是。好像框架并没有为您提供必须修复的非线程安全起点。像原型控制器这样的 Singleton 本身并不是线程安全的或线程不安全的。这完全取决于您如何编码。如果您遵守规则并且知道自己在做什么,那么这两种设计选择中的任何一种都没有问题。否则,这两种设计选择都会出现问题。
    • 只要控制器作为单例是无状态的,就不会发生任何不好的事情。 Spring MVC 强制执行无状态设计。必须真正脱离框架才能使其成为有状态的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2015-03-31
    • 1970-01-01
    • 2017-07-02
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多