如何在群集环境中使用javax.ejb.Singleton?

时间:2015-04-07 16:25:56

标签: java java-ee ejb ejb-3.0 java-ee-6

我需要在应用程序中维护一个对于群集环境中的所有用户和所有节点都是唯一的简单计数器。 我想过如下使用单例会话bean注释javax.ejb.Singleton:

package foo;

import javax.ejb.Singleton;

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

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

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

3 个答案:

答案 0 :(得分:11)

  

群集中的每个节点是否都拥有自己的实例?

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

请记住,Java EE规范并没有定义任何类型的集群行为。您需要搜索特定的供应商解决方案才能实现此类要求。仅作为示例,请参阅此link

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

哈单身是一种方法。作为进步,存在一些局限性。 如果您阅读,您将拥有一个@stateless bean,可通过" getValue()"访问该服务。方法。 get值调用单例bean的方法并给你一个值......直到那里。

但是如果你需要使用bean,一个策略应该通过get值返回一个SingletonBean实例,但是......你将有更多的单例bean实例....并且存在问题。