首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分布式锁定与Java EE

分布式锁定与Java EE
EN

Stack Overflow用户
提问于 2011-03-28 16:08:09
回答 2查看 4.4K关注 0票数 4

我正在使用JBoss作为6编写一个Java应用程序,而且我有一个资源,需要对给定参数的方法进行独占访问(与第三方软件的一些接口)。目前,我正在调皮(自规范禁止它)和使用java.util.concurrent.ReentrantLock处理锁定。

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

  1. 共享缓存(Infinispan)
  2. JGroups
  3. 基于文件系统的锁定(可能不好,但我们还是依赖共享文件系统)
  4. 数据库
  5. 单例EJB的?

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

代码语言:javascript
复制
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();
        }
    }

我错过了什么选择吗?有没有人有这种锁定机制的经验,他们可以分享?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-28 16:41:38

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

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

如果您想坚持使用同构的分布式系统(这在一般情况下并不是个坏主意),我建议使用SELECT FOR UPDATE进行数据库锁定。我从未尝试过这种方法,但我认为在使用库(获取锁)之前发出这样的SQL并让EJB容器提交事务(实际上是释放锁)将起作用。

票数 2
EN

Stack Overflow用户

发布于 2011-03-28 16:56:18

使用http://hadoop.apache.org/zookeeper/怎么样?它是分布式系统上一种非常轻的文件系统,是实现锁的良好解决方案。

参见:outOfTheBox

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5461829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档