无国籍豆如何处理单身豆?

时间:2017-08-30 23:29:40

标签: java-ee ejb

当我有一个使用单例JPA DAO的无状态服务类并且许多客户端同时请求相同的方法时,EJB会堆积剩余的请求吗?是否有等待的时间/请求列表大小限制?它是否知道一次只有一个无状态应该访问DAO?如果是,它是如何做到的?

我认为如果发出100个请求,则实例化100个无状态bean,但只有一个DAO实例。这会引发异常还是会发生某种管理?拥有DAO确实会使无状态服务池无用吗?

最后,正确的行为是什么,我的意思是,无状态的豆排队等待单身DAO?

2 个答案:

答案 0 :(得分:1)

Singleton容器同步EJB的访问权限。查看有关可靠性管理的documentation部分。这来自docs:

  

Singleton会话bean是为并发访问而设计的,在这种情况下,许多客户端需要同时访问会话bean的单个实例。单例的客户端只需要对单例的引用,以便调用单例公开的任何业务方法,而不需要担心可能同时在同一单例上调用业务方法的任何其他客户端。

我建议使用这部分文档:

  

如果可以与许多客户端同时访问或共享该方法,则使用@Lock(READ)注释单例的业务或超时方法。如果单个会话bean在客户端调用该方法时应锁定到其他客户端,则使用@Lock(WRITE)注释业务或超时方法。通常,当客户端修改单例的状态时,将使用@Lock(WRITE)注释。

或者您可以使用bean-managed concurency自行控制同步过程。然后,您需要添加synchronized锁或您用于控制对共享资源的访问的任何内容。在这种情况下,容器不会参与其中。

答案 1 :(得分:1)

不,它不会抛出任何异常,容器会使你的99个线程在等待访问方法,如果你使用

@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)

@Lock(WRITE)  

几乎与使用synchronized块一样。

但是,如果假设在同步方法上可以阻止这么多线程,那么它看起来是一个糟糕的设计。

为什么你需要你的DAO成为单身人士?我会说这不典型。