gpt4 book ai didi

java - 分布式锁定和 Java EE

转载 作者:搜寻专家 更新时间:2023-11-01 02:53:59 25 4
gpt4 key购买 nike

我正在使用 JBoss AS 6 编写一个 Java EE 应用程序,我有一个资源需要独占访问(第三方软件的一些接口(interface))给定参数的方法。目前我很顽皮(自 specification prohibits it 以来)并使用 java.util.concurrent.ReentrantLock 来处理锁定。

现在我将多个 JBoss 应用程序服务器集群在一起,因此我需要一个可以跨集群中不同节点工作的解决方案。我想我至少有以下选择。

  1. 共享缓存(Infinispan)
  2. JGroups
  3. 基于文件系统的锁定(可能不好,但无论如何我们都依赖共享文件系统)
  4. 数据库
  5. Singleton EJB的?

理想情况下,我正在寻找一个高级 API,以便我可以编写这样的 EJB 方法

public class MyEJBBean {

private SharedLock lock;

public void doSomethingWithSharedResource(String s) {
lock.lock(); // blocks until shared resource is not used by anyone else
try {
// Use shared resource
}
finally {
lock.unlock();
}
}

我是否遗漏了任何选项?有没有人可以分享这种锁定机制的经验?

最佳答案

理想情况下,我建议将第三方软件包装到一个单独的应用程序中,该应用程序仅在单个实例上运行。这样您就可以使用 EJB 单例处理锁定(我相信 @Singleton 不会在您的场景中帮助您)并使用远程 EJB/WS 公开它。看起来这个软件有点讨厌(单线程?)所以拥有更加用户友好的 EJB 界面将是一个额外的好处。

想一想 - 如果整个系统一次只能访问一次库,为什么还要分发它呢?无论如何,最多只能使用一个实例。

如果您想坚持使用同类分布式系统(这通常不是一个坏主意),我建议使用 SELECT FOR UPDATE 锁定数据库。我从未尝试过,但我认为在使用您的库(获取锁)之前发出这样的 SQL,然后让 EJB 容器提交事务(有效地释放锁)就可以了。

关于java - 分布式锁定和 Java EE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5461829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com