1

我将我的应用程序部署在具有两台服务器的集群中。当我使用以下方式设置任何属性时:

this.getServletContext().setAttribute("test", testObj);
  1. 是否可以通过两个服务器访问testObj带有密钥的属性?test
  2. 服务器的数量是否等于 JVM 的数量?就我而言,有两台服务器,这是否意味着有两个 JVM?
  3. 根据我的理解, ServletContext是每个 JVM 每个 webapp 一个,所以在我的情况下,testObj当通过两个 JVM 访问时是否可用?
4

1 回答 1

2

根据ServletContext javadoc

对于在其部署描述符中标记为“分布式”的 Web 应用程序,每个虚拟机将有一个上下文实例。在这种情况下,上下文不能用作共享全局信息的位置(因为信息不会是真正的全局信息)。请改用数据库等外部资源。

Servlet 规范还在“SRV.4.4.1 分布式容器中的上下文属性”中声明:

上下文属性对于创建它们的 JVM 来说是本地的。这可以防止 ServletContext 属性成为分布式容器中的共享内存存储。当需要在分布式环境中运行的 servlet 之间共享信息时,应将信息放入会话中(参见第 SRV.7 章,“会话”),存储在数据库中,或设置在 Enterprise JavaBeansTM 组件中。

所以你的问题的答案是否定的,该属性在整个集群中是不可访问的,它仅在本地 JVM 上可用。

至于每台服务器的 JVM 数量,在基本设置中,您可以在每台物理机器上拥有一个 JVM,但您也可以在同一台机器上拥有更多 JVM,具体取决于应用程序的特性或者您是否希望最大限度地利用硬件

于 2012-10-10T20:12:38.053 回答