2012-04-05 69 views
2

今天,利用JPA,Guice和JSR 303 bean验证,构建平台非常快捷。掀起一些东西很容易。如何在没有Java EE应用服务器的情况下在java集群中执行单例操作

假设我在使用Guice,并且在一个JVM机器集群内有一个轮询过程作为单例。我怎会轻易让它如此

  1. 当群集启动(3台),只有一个启动的单身了
  2. 当与正在运行的单机器故障,另外一台机器启动了singleton

这对今天的图书馆来说不是太难,对吧?我看起来越多,我认为jgroups是答案,但希望听取其他人的意见(Jboss使用迄今为止所见到的jgroups)。

+1

您知道JPA是Java EE的一个子集,对吧? – 2012-04-05 18:31:43

+0

您似乎对“JEE”的含义感到困惑。它不是“EJB's”的同义词。除此之外,尽管...如果你不想使用JEE/EJB,那么为什么“java-ee”是你用这个问题标记的ONLY标签? – 2012-04-05 18:38:50

+0

是的,我确实知道JPA是Java EE的子集,所以是的,我误解了,我想我应该说没有JavaEE应用服务器。 – 2012-04-06 13:27:40

回答

1

我会去和分布式锁定,看看Hazelcast and Singleton。可能也可以做到这一点。

+2

我已经看到这与EHCache(由Terracotta开源项目)完成。但是,如果提供有关应用程序的更多详细信息,则可能会得到更彻底的答案。十分之九的时候,当你需要在集群环境中使用单例时,你真正需要的是基于JMS消息队列的方法。 – 2012-04-05 18:44:41

0

我正在研究这个问题。 JBoss看起来像是使用了jgroups,这看起来很简单,可能也是一种方法。

1

如果您的应用程序中有可用的中央数据库,则可以对数据库表格行使用悲观锁定。每个特定服务器节点上的每个单身人员都试图在特定的表格行上获得一个悲观的锁定(由Oracle“SELECT FOR UPDATE”获得)。如果单身人士获得锁定,它可以做任何需要的。否则它只是等待锁定。如果正在工作的单例实例关闭,另一个等待的单例获取该锁并因此开始工作。 您必须注意不要通过提交或回滚来结束事务,以确保只要实例处于活动状态就保持行级别锁定。

或者,工作单例可以以周期性方式保存时间戳,其他等待的单例检查此时间戳在特定时间间隔内是否更新。如果它不再更新,另一个单身人士可以获得该时间戳的“所有者”并开始自行工作。此方法不需要用于保持锁定的专用数据库连接,但接管另一个集群成员的速度较慢,因为必须等待超时。

- 罗伯特

相关问题