Spring MVC,@ SessionAttribute和可伸缩性

时间:2012-02-28 23:36:56

标签: java spring-mvc

我们正在为8万用户构建Spring-MVC Web应用程序。

我在petclinic示例中看到很多控制器使用: @SessionAttribute注释和 SessionStatus status ... status.setComplete()来存储和删除HTTP会话中的bean。非常有用。

如果您计划为8万用户构建应用程序,这是最好的方法吗? 如果您打算存储所有这样的表单数据,您仍然可以使用会话负载平衡和会话故障转移吗?

1 个答案:

答案 0 :(得分:3)

它可能无法满足您的需求,不。内置实现存在两个主要问题:

  1. 它并不真正支持标签式浏览。如果用户在多个浏览器选项卡中加载相同的屏幕,则访问一个控制器的两个选项卡将会破坏彼此的会话属性数据。

  2. 如果用户未遵循您的“计划”导航路径,setComplete()呼叫将被错过,并且对象会无限期地挂起,直到会话过期并被清除。

  3. 第1号可能会或可能不会引起关注,具体取决于您的应用的设计方式和使用方式。 (有些事情,例如,银行,无论如何故意阻止多标签的使用)但我认为大多数用户希望能够在一个标签中编辑用户A的个人资料,而在另一个标签中编辑用户B的个人资料而没有提交一个表格打破另一个屏幕。

    你可以通过总是将屏幕提交到自己的控制器然后在清理后重定向来解决问题2,但如果你还没有建立这种方式,这将是很多工作。

    好消息是org.springframework.web.bind.support.SessionAttributeStore是公认的延伸点!您可以提供您喜欢的任何实现,并将其注入您的调度程序servlet。如果要避免使用业务对象使其膨胀,则甚至不需要使用Web会话来存储信息。例如,您可以将实际存储放在后端兵马俑集群中,而不用担心它与您的集群策略兼容。

    -

    如果你确实需要真正的可扩展性,那么总会有选项Gamma:将它重新编写成一个不依赖于服务器端状态的RESTful策略:)