有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring MVC、@SessionAttribute和可伸缩性

我们正在为8万用户构建一个Spring MVC web应用程序

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

如果你计划为8万用户开发一个应用程序,这是最好的方式吗? 如果您计划像这样存储所有表单数据,是否仍然可以使用会话负载平衡和会话故障切换


共 (1) 个答案

  1. # 1 楼答案

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

    1. 它实际上不支持标签浏览。如果用户在多个浏览器选项卡中加载同一屏幕,那么访问一个控制器的两个选项卡将相互碰撞对方的会话属性数据

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

    1号可能是问题,也可能不是问题,这取决于你的应用程序的设计和功能。(一些东西,例如银行,故意阻止多标签的使用)但我认为大多数用户都希望能够在一个标签中编辑用户A的个人资料,在另一个标签中编辑用户B的个人资料,而不必提交一个表单来破坏另一个屏幕

    第二,你可以通过总是将一个屏幕提交到它自己的控制器中,然后在清理后重定向来解决这个问题,但是如果你还没有这样构建的话,这是一个很大的工作

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

    如果您真的需要真正的可伸缩性,那么总会有Gamma选项:将其重新设计成一种RESTful策略,而不是一开始就依赖服务器端状态:)