【发布时间】:2014-08-23 14:49:05
【问题描述】:
我对 Spring MVC 了解不多,但这个问题是基于旧 MVC 框架的假设。为什么我想看到多个请求是由单个实例处理的,即控制器(默认情况下,spring bean 是单例的)。所以在这种情况下,如果该网站的用户数量非常庞大,这是一个性能问题。
【问题讨论】:
标签: spring spring-mvc
我对 Spring MVC 了解不多,但这个问题是基于旧 MVC 框架的假设。为什么我想看到多个请求是由单个实例处理的,即控制器(默认情况下,spring bean 是单例的)。所以在这种情况下,如果该网站的用户数量非常庞大,这是一个性能问题。
【问题讨论】:
标签: spring spring-mvc
我不太明白你到底在问什么。
spring beans 默认是单例的
是的,他们是。这是完全有道理的:一旦容器被引导,您就拥有了响应请求所需的所有实例。事实上,它们在整个生命周期中被实例化一次并且只有一个实例,这有助于降低创建新实例的影响。
想想负载下的系统:
如果它们不是单例,每个请求都会创建一个新的控制器实例。这需要(很少)时间,但完全需要时间。然后在响应请求后,不再需要这些实例。一个新请求将创建一个新实例。所以你用大量的“一次性对象”乱扔你的JVM,这些对象必须在某个时间点进行垃圾收集。这会导致 GC 暂停。这是不受欢迎的行为。因此,为了提高吞吐量和响应时间,使用Singletons 是有意义的(在 Spring-sense 中)。
所以在这种情况下,如果该网站的用户数量非常庞大,这是一个性能问题。
不,相反:这 - 正如我所说 - 提高了性能。
当然,如果您担心Slashdot Effect,使用带有多个冗余实例和前面的负载均衡器的服务器布局是明智之举。但这是另一个主题的主题。
【讨论】:
使用一个或 10000 个实例这一事实对性能没有任何影响。
重要的是并行工作的线程数。无论这些线程都使用单个实例还是每个都有自己的控制器实例都不会改变任何事情。
【讨论】:
Singletons 是否高效。答案是肯定的。
多个请求由单个控制器实例处理不是线程安全的!开发者在某些情况下必须添加同步进程,这将是性能瓶颈!如果每个控制器实例请求,控制器是线程安全的,大多数情况下不需要同步。至于创建多个控制器实例,这不会造成严重的性能问题,而且现代计算机的内存已经足够大了。
PS:正如我在我的 cmets 中提供的:
这不是一个正确或错误的选择,每个控制器的请求和单例控制器是两种策略。很难说哪个更好或更坏。我刚才说线程安全是这两种策略的一个重要关注点。
【讨论】: