javax.ejb.Singleton 单例在集群环境下如何?

How singleton is javax.ejb.Singleton in a clustered environment?

我需要为集群环境中的所有用户和所有节点维护一个在应用程序中唯一的简单计数器。 我考虑过像这样使用单例会话 bean 注释 javax.ejb.Singleton:

package foo;

import javax.ejb.Singleton;

@Singleton
public class Bean {
    private int counter;
    [...]
}

这看起来很简单,但如果它在集群环境中按预期工作,我找不到答案。集群的每个节点是否都有自己的实例?

当然,我可以将 bean 持久保存在数据库中,但它实际上只是一个计数器,这样做就太过分了。另外,我希望计数器在应用程序崩溃或重新启动时重置,因此坚持使用它会产生比它解决的问题更多的问题。

Would every node of the cluster have it's own instance or not?

是的,每个集群节点都会有一个不同的单例实例。因此,@Singleton 注解不是解决您问题的方法。

请记住,JavaEE 规范未定义任何类型的集群行为。您需要搜索特定的供应商解决方案来实现这种需求。举个例子,看这个 link.

您可以使用 hazelcast。它是一个分布式内存键值存储。看起来这将是一个完美的契合。它还实现了 JCache 规范 JSR-107。

哈单例是一种做法。作为一个进步,有一些限制。 如果您阅读,您将拥有一个通过 "getValue()" 方法访问服务的 @stateless bean。 get 值调用单例 bean 的方法并为您提供一个值......好吧,直到那里。

但是如果你需要对bean进行操作,一个策略应该return一个SingletonBean实例通过获取值,但是..你将有更多的那个singleton bean实例....并且有问题。