【问题标题】:How are static objects treated while clustering?聚类时如何处理静态对象?
【发布时间】:2011-05-06 10:51:50
【问题描述】:

静态对象只初始化一次。单例类只实例化一次。如果我们在集群中使用单例,那么它将在集群中创建多个单例实例。 那么集群环境中的静态对象会怎样呢? 为什么这个对象没有在其他集群服务器中初始化?或者为什么对象状态没有改变?

【问题讨论】:

标签: java jakarta-ee singleton cluster-computing


【解决方案1】:

静态对象总是在 ClassLoader 的范围内(在大多数情况下每个 JVM)并且不考虑在集群中。如果你需要一个 Singleton,你必须告诉容器创建一个。 这取决于您的 Singleton 的性质,是每个集群只存在一个,还是每个 JVM 存在一个,或者每个 Classloader 存在一个。

【讨论】:

    【解决方案2】:

    集群中的每个节点都在单独的 JVM 中运行 - 因此每个 JVM(集群节点)都有自己的 Singleton。如果你把集群看成一个 JVM 系统,那么集群中 Singleton 的实例数确实等于节点数。

    集群范围的 Singleton 不能用普通的 Java 类实现。您可能需要提供单例的单个(非集群)服务器实例。

    【讨论】:

      【解决方案3】:

      单例在单个进程中甚至都不可靠。您可以通过多个类加载器加载同一个类,并最终得到多个“单例”对象。

      单例是一种反模式是有原因的——避免它

      集群中的情况更糟,因为所有节点必须协调以决定单例的位置。这很容易受到网络分区的影响,因此是站不住脚的。 Brewer 的CAP Theorem 将为您提供有关这方面的一些背景信息。

      【讨论】:

      • 通常,这取决于用例。通常在某个范围内(即每个 ClassLoader)拥有一个“单例”就足够了,例如用于缓存一些数据。在这种情况下效率可能会降低,因为并非所有人都可以看到完整的缓存,并且它可能包含冗余甚至不同的数据,但是如果您知道限制,则可以应用该模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多