Java JBoss7集群中的共享同步池

Java JBoss7集群中的共享同步池,java,jboss,ejb,jboss7.x,cluster-computing,Java,Jboss,Ejb,Jboss7.x,Cluster Computing,背景 我有一个具有两个节点的集群JBoss环境。我已经成功地实现了两个群集计划任务,它们一次只在一个节点上运行。如果当前拥有计划任务的节点关闭,则所有权将转移到另一个节点。我用官方的例子来实现它,它就像一个魅力 我想做什么 请注意,下面不是关于时间表的。这是关于一个现在需要在集群上保持状态的单例。以上只是我尝试过的一个描述 现在我有了一个连接池,它也需要分布在节点上。此池包含一个同步列表,其中包含到外部系统的连接的抽象。客户端“借用”一个连接,做一些工作,然后返回它。这种情况经常发生,每小时最多

背景

我有一个具有两个节点的集群JBoss环境。我已经成功地实现了两个群集计划任务,它们一次只在一个节点上运行。如果当前拥有计划任务的节点关闭,则所有权将转移到另一个节点。我用官方的例子来实现它,它就像一个魅力

我想做什么

请注意,下面不是关于时间表的。这是关于一个现在需要在集群上保持状态的单例。以上只是我尝试过的一个描述

现在我有了一个连接池,它也需要分布在节点上。此池包含一个同步列表,其中包含到外部系统的连接的抽象。客户端“借用”一个连接,做一些工作,然后返回它。这种情况经常发生,每小时最多6000次。它被定义为一个
@Singleton
EJB,简化后看起来像这样:

@Singleton
@启动
公共类ConnectionPoolBean{
具有SynchronizedPool池的私有SomeObjects;
公共连接(){
pool.getConnectionFromSynchronizedList();
}
公共连接(){
pool.returnConnectionFromSynchronizedList();
}
}
如果可能的话,我想访问下面这样的类(我可以修改遗留代码)<代码>连接池将引用同一个对象,而不管哪个节点正在执行代码

@无状态
公共类SomeBeanUsingPool实现SomeBeanUsingPoolInterface{
@EJB
私有连接池bean连接池;
公共无效剂量测定法(){
connectionPool.borrowConnection();
//做些事情。。。
connectionPool.returnConnection();
}
}
我尝试过的

我重用了后台描述的实现,实现了一个HA单例服务。然而,这意味着该类一次只能在一个节点上可用(即,对于节点2,在节点1关闭之前,它不会在容器中启动)。这让我意识到,集群HA单例并不是解决问题的方法,它只能确保bean一次只能在一个节点上可用

问题


如何实现我的目标,为整个集群提供一个共享池?我真正需要共享的是
ConnectionPoolBean.pool
对象,因为同步就是在那里发生的。尽管在集群中共享整个
ConnectionPoolBean
会很好。此外,如果一个节点发生故障,我需要保持状态,我认为HA单例不适合这种情况。

它是主动/主动还是主动/被动群集?你的集群中有数据库吗?我会尽力回答你的问题(我还不是集群专家:)。两个节点都是相同的,并且同时运行,我想这会使它处于活动/活动状态。两个节点使用相同的数据库。我们使用Hibernate和JBoss完整配置文件。这意味着(如果我没有弄错的话,JConsole似乎验证了这一点)infinispan在集群中直接缓存实体。希望这能回答您的问题。也许我并没有正确理解您的需求,但在每个节点上使用普通池,并在其他节点上进行同步(例如数据库中的信号量表)怎么样。共享状态也可以在数据库中。这个问题有点抽象。你的游泳池里有什么?连接池队列是什么?你的任务频率是多少?排队是我的错别字。我尽量把问题说清楚,但我明白你的意思。池是到外部系统的自由连接的抽象。节点从池中“借用”连接,与外部系统对话,然后返回连接。这样做的频率最高可达每小时6000次左右。如果可能,我希望避免使用您的数据库解决方案。数据库解决方案可以工作,但这需要一些开销。我希望存在一些优雅的JEE/JBoss方法来解决这个问题。我读过计划任务(“作业”),所以我没想到会出现这种频率。因此,是的,我同意,数据库解决方案可能不合适。但同步对象是什么(并发用户数)?那么...怎么样