集群环境中Spring会话范围bean和Java静态对象的行为

集群环境中Spring会话范围bean和Java静态对象的行为,java,spring,session,static,Java,Spring,Session,Static,在集群环境中,我知道HttpSession对象从一个VM迁移到另一个VM。但是,如果我将信息存储在Spring会话范围的bean中,或者将信息存储在类的静态映射中,该怎么办?存储的数据会发生什么变化 存储在静态变量中的信息保持在加载该类的类加载器的本地,不会被迁移。您(或Spring)放入HttpSession中的任何内容都会被迁移,因为应用程序服务器负责提供会话,并且它知道其他节点在哪里,并且可以设置它来进行迁移 这是静态变量(以及滚动您自己的缓存)有问题的原因之一,因为您可以使用它们构建一个

在集群环境中,我知道HttpSession对象从一个VM迁移到另一个VM。但是,如果我将信息存储在Spring会话范围的bean中,或者将信息存储在类的静态映射中,该怎么办?存储的数据会发生什么变化

存储在静态变量中的信息保持在加载该类的类加载器的本地,不会被迁移。您(或Spring)放入HttpSession中的任何内容都会被迁移,因为应用程序服务器负责提供会话,并且它知道其他节点在哪里,并且可以设置它来进行迁移

这是静态变量(以及滚动您自己的缓存)有问题的原因之一,因为您可以使用它们构建一个在一台服务器上运行良好的应用程序,但如果您将其部署到多个节点,则由于缓存彼此不一致,因此无法正常工作


要迁移不在HttpSession中的数据,必须配置某种缓存()。

存储在静态变量中的信息对于加载该类的类加载器来说是本地的,不会被迁移。您(或Spring)放入HttpSession中的任何内容都会被迁移,因为应用程序服务器负责提供会话,并且它知道其他节点在哪里,并且可以设置它来进行迁移

这是静态变量(以及滚动您自己的缓存)有问题的原因之一,因为您可以使用它们构建一个在一台服务器上运行良好的应用程序,但如果您将其部署到多个节点,则由于缓存彼此不一致,因此无法正常工作


要迁移不在HttpSession中的数据,必须配置某种缓存()。

服务器群集的会话复制配置将会话对象从一个节点复制到另一个节点。还有不同的会话复制策略

话虽如此,如果您的Spring会话bean是可序列化的,那么复制就会发生。只有当从bean生成的对象引用也是可序列化的时,会话范围的bean才是可序列化的。只有当整个对象树可序列化时,才会发生序列化


如果符合您的要求,您可以将所有非会话所需的引用设置为瞬态引用。

服务器群集的会话复制配置将会话对象从一个节点复制到另一个节点。还有不同的会话复制策略

话虽如此,如果您的Spring会话bean是可序列化的,那么复制就会发生。只有当从bean生成的对象引用也是可序列化的时,会话范围的bean才是可序列化的。只有当整个对象树可序列化时,才会发生序列化


如果符合您的要求,您可以将所有非会话所需的引用都设置为瞬态引用。

问题:单例范围bean中的静态对象如何?@CM_2014:这也是一个JVM的本地对象,不会复制到集群中的其他节点。感谢您的详细解释和spring缓存引用!问:单例作用域bean中的静态对象如何?@CM_2014:这也是一个JVM的本地对象,不会复制到集群中的其他节点。感谢您的详细解释和spring缓存参考!